Você está confundindo dois tipos muito diferentes de entrada: STDIN e argumentos. Argumentos são uma lista de cadeias de caracteres fornecidas ao comando quando ele é iniciado, geralmente especificando-as após o nome do comando (por exemplo, echo these are some arguments
ou rm file1 file2
). STDIN, por outro lado, é um fluxo de bytes (às vezes texto, às vezes não) que o comando pode (opcionalmente) ler após o início. Aqui estão alguns exemplos (observe que cat
pode aceitar argumentos ou STDIN, mas faz coisas diferentes com eles):
echo file1 file2 | cat # Prints "file1 file2", since that's the stream of
# bytes that echo passed to cat's STDIN
cat file1 file2 # Prints the CONTENTS of file1 and file2
echo file1 file2 | rm # Prints an error message, since rm expects arguments
# and doesn't read from STDIN
xargs
pode ser pensado como a conversão de entrada no estilo STDIN em argumentos:
echo file1 file2 | cat # Prints "file1 file2"
echo file1 file2 | xargs cat # Prints the CONTENTS of file1 and file2
echo
na verdade, faz mais ou menos o contrário: ele converte seus argumentos em STDOUT (que pode ser canalizado para o STDIN de algum outro comando):
echo file1 file2 | echo # Prints a blank line, since echo doesn't read from STDIN
echo file1 file2 | xargs echo # Prints "file1 file2" -- the first echo turns
# them from arguments into STDOUT, xargs turns
# them back into arguments, and the second echo
# turns them back into STDOUT
echo file1 file2 | xargs echo | xargs echo | xargs echo | xargs echo # Similar,
# except that it converts back and forth between
# args and STDOUT several times before finally
# printing "file1 file2" to STDOUT.
ls | grep -v "notes.txt" | xargs rm
remover tudo, excetonotes.txt
, ou em geral, nunca analisa als
saída . Seu comando seria interrompido se um único arquivo contivesse um espaço, por exemplo. A maneira mais segura seriarm !(notes.txt)
em Bash (comshopt -s extglob
set), ourm ^notes.txt
no Zsh (comEXTENDED_GLOB
) etc.