17

Я не совсем понимаю, как трубы работают в Bash.

Я знаю, что он принимает вывод одной команды в качестве ввода другой команды.

Какой вывод я могу получить, потому что это то, что команда выводит на экран.

Но как мне узнать, какой ввод примет команда?

Вот пример, который я думал, будет работать:

which gem | rm

К сожалению, это не так.

Какой драгоценный камень выводит /usr/bin/gem так что это должно быть правильным выводом?

Я думал, что это было передано rm, так что это будет rm /usr/bin/gem но я ошибся.

Итак, мой вопрос: как мне узнать, какой ввод принимает команда?

4 ответа4

23

"Ввод" и "аргументы командной строки" - это разные вещи.

rm удаляет файлы, представленные в качестве аргументов.

Канал перенаправляет вывод левой команды на ввод правой команды. Это не влияет на аргументы командной строки программы справа.

Чтобы сделать то, что вы пытаетесь сделать, попробуйте использовать xargs для преобразования стандартного ввода в аргументы командной строки для выполнения программы. Это его работа.

какой драгоценный камень | Например, which gem | xargs rm удалит этот gem из вашей переменной PATH.

12

rm не принимает входные данные, он принимает аргументы. Это разные. Аргументы - это ключи, имена файлов и т.д., Которые вы передаете программе в командной строке, чтобы повлиять на ее поведение. Ввод - это данные, над которыми работает программа. Например, grep принимает как входные данные, так и аргументы:

grep "foo" file.txt

Там есть два аргумента "foo" и file.txt . Вход содержание file.txt а не строка file.txt себе. Поскольку grep принимает данные, вы можете использовать их с конвейерами:

cat file.txt | grep "foo"

производит тот же вывод, так как cat принимает file.txt в качестве аргумента и производит содержимое file.txt качестве вывода. Затем этот вывод передается в grep, что дает тот же эффект, что и сам grep, чтобы открыть файл, как в первом примере.

Если вы хотите использовать выходные данные одной программы в качестве аргумента другой, используйте обратные пометки:

rm `which gem`

или этот альтернативный (специфичный для bash) синтаксис:

rm $(which gem)

Редактировать: или xargs как указывает другой ответчик. Множество способов убрать кошку из командной строки.

3

Проверьте man страницы команд, которые вас интересуют. Эти программы будут указывать, что они читают из stdin (попробуйте man grep для популярной команды, которая читает stdin).

2

Все это опасно для запуска, если в вашей переменной PATH есть каталог с пробелом или если имя команды содержит пробел:

rm `which gem`       # Dangerous
rm $(which gem)      # Dangerous
which gem | xargs rm # Dangerous

В GNU Parallel http:// www.gnu.org/software/parallel/ такой проблемы нет, поэтому это будет работать, даже если в вашей переменной PATH есть каталог с пробелом или если имя команды содержит пробел:

which gem | parallel rm
parallel -a <(which bass) rm

Посмотрите вступительное видео для GNU Parallel:http://www.youtube.com/watch?v=OpaiGYxkSuQ

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .