Ви плутаєте два дуже різні види введення: STDIN та аргументи. Аргументи - це список рядків, що надаються команді під час її запуску, зазвичай, вказуючи їх після імені команди (наприклад, echo these are some arguments
або rm file1 file2
). З іншого боку, STDIN - це потік байтів (іноді текст, іноді ні), який команда може (необов'язково) читати після її запуску. Ось кілька прикладів (зауважте, що cat
можна брати аргументи або STDIN, але це робить різні речі з ними):
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
можна вважати перетворенням введення стилю STDIN в аргументи:
echo file1 file2 | cat # Prints "file1 file2"
echo file1 file2 | xargs cat # Prints the CONTENTS of file1 and file2
echo
насправді робить більш-менш навпаки: він перетворює свої аргументи в STDOUT (що може бути передано в STDIN іншої команди):
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
для видалення всього, окрімnotes.txt
, або взагалі ніколи не аналізуватиls
вихід . Ваша команда порушиться, якщо, наприклад, у одному файлі міститься пробіл. Більш безпечним способом було бrm !(notes.txt)
в Bash (зshopt -s extglob
набором), абоrm ^notes.txt
в Zsh (зEXTENDED_GLOB
) тощо