Я не совсем понимаю, как трубы работают в Bash.
Я знаю, что он принимает вывод одной команды в качестве ввода другой команды.
Какой вывод я могу получить, потому что это то, что команда выводит на экран.
Но как мне узнать, какой ввод примет команда?
Вот пример, который я думал, будет работать:
which gem | rm
К сожалению это не так.
Какой драгоценный камень распечатывается /usr/bin/gem
так, что должен быть правильный вывод?
Я думал, что это было дано г-ну, так будет, rm /usr/bin/gem
но я ошибался.
Итак, мой вопрос: как мне узнать, какой ввод принимает команда?
rm /usr/bin/gem
это ужасная идея. Оставьте этоgem
(и Ruby-интерпретатор, с которым он идет) в покое и установите предпочитаемый Ruby-интерпретатор (иgem
), используяrvm
: rvm.beginrescueend.comОтветы:
«Ввод» и «аргументы командной строки» - разные вещи.
rm
удаляет файлы, представленные в качестве аргументов.Канал перенаправляет вывод левой команды на ввод правой команды. Это не влияет на аргументы командной строки программы справа.
Чтобы сделать то, что вы пытаетесь сделать, попробуйте использовать
xargs
для преобразования стандартного ввода в аргументы командной строки для выполнения программы. Это его работа.which gem | xargs rm
Например, удалитgem
в вашем PATH.источник
rm
не принимает входные данные, он принимает аргументы. Это разные. Аргументы - это ключи, имена файлов и т. Д., Которые вы передаете программе в командной строке, чтобы повлиять на ее поведение. Ввод - это данные, над которыми работает программа. Например,grep
принимает как входные данные, так и аргументы:Там есть два аргумента
"foo"
иfile.txt
. Ввода является содержимым изfile.txt
, а не строкfile.txt
самого. Поскольку grep принимает данные, вы можете использовать их с конвейерами:производит тот же вывод, так как cat принимает
file.txt
в качестве аргумента и производит содержимоеfile.txt
выводит в качестве вывода. Затем этот вывод передается в grep, что дает тот же эффект, что и сам grep, как в первом примере.Если вы хотите использовать выходные данные одной программы в качестве аргумента другой, используйте обратные пометки:
или этот альтернативный (специфичный для bash) синтаксис:
Изменить: или,
xargs
как указывает другой ответчик. Множество способов убрать кошку из командной строки.источник
cat file.txt | grep "foo"
может быть в сотни раз медленнее, чемgrep "foo" file.txt
.grep --help
краткий обзор принятых аргументов.Проверьте
man
страницы команд, которые вас интересуют. Эти программы будут указывать, что они читаютstdin
(попробуйтеman grep
воспользоваться популярной командой, которая читает stdin).источник
man grep | grep 'standard input'
и получилIf no file arguments are specified, the standard input is used.
как последний матч. Had Мне пришлосьgrep
немного попробовать собственный препарат. 😎Все это опасно для запуска, если в вашей переменной PATH есть каталог, в котором есть пробел, или если имя команды содержит пробел:
В GNU Parallel http: // www.gnu.org/software/parallel/ такой проблемы нет, поэтому это будет работать, даже если в вашей переменной PATH есть каталог с пробелом или если имя команды содержит пробел:
Посмотрите вступительное видео для GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ
источник