Isso é o que é xargs
. Ele pega uma lista de palavras (em branco ou em nova linha separadas, também compreendendo alguma forma de citar) em seu stdin e passa elas como argumentos para o (s) comando (s) que executa.
Aqui, se você quiser passar hello word
como um argumento para curl
, será necessário:
echo '"hello world"' | xargs curl...
Em que xargs
entende os "..."
como um mecanismo de cotação para evitar que o espaço entre hello
e world
seja tratado como um separador de argumentos. xargs
também entende \
e '...'
(de maneiras diferentes de shells POSIX).
Com o GNU xargs
, você também pode especificar o delimitador. Por exemplo com:
echo hello world | xargs -d '\n' curl...
Apenas nova linha seria entendida como delimitadora (não em branco) e os mecanismos de cotação desativados.
Isso permite que você passe o conteúdo de cada linha (em oposição a cada palavra) como argumento para o comando.
Embora -d
raramente seja suportado fora do GNU xargs
, -0
, outra de suas extensões (para delimitar NULs e desativar o processamento de cotações) é mais amplamente suportada. Então você também pode fazer:
echo hello world | tr '\n' 'echo hello world | xargs -I@@ curl... @@
' | xargs -0 curl...
Se houver várias linhas de entrada, xargs
passará todas elas como argumentos separados para curl
. Se você quiser chamar um curl
para cada linha, você pode adicionar uma opção -n 1
.
Você também pode usar:
echo '"hello world"' | xargs curl...
Isso chama um curl
para cada linha, mas observe que os espaços em branco iniciais são eliminados e xargs
ainda faz algum processamento de cotação, portanto, deve ser evitado para dados arbitrários.