Понимание, как исходные данные отправляются в каналы в Bash

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

Я знаю, что это берет вывод от одной команды как вход в другой команде.

Какой вывод, я могу добраться, потому что это - то, что команда распечатывает на экран.

Но то, как я знаю то, что вводит команду, возьмет?

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

which gem | rm

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

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

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

Таким образом, мой вопрос, как я знаю то, что вводит команду, берет?

17
задан 17.08.2018, 23:30

4 ответа

"Вход" и "параметры командной строки" являются разными вещами.

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

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

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

which gem | xargs rm, например, удалит gem в Вашем ПУТИ.

23
ответ дан 07.12.2019, 10:35

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

grep "foo" file.txt

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

cat file.txt | grep "foo"

производит тот же вывод, так как кошка берет file.txt как аргумент и создание содержания file.txt как произведено. Тот вывод затем передается по каналу в к grep, давая тот же эффект, как имеющий grep открывают сам файл, как в первом примере.

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

rm `which gem`

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

rm $(which gem)

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

12
ответ дан 07.12.2019, 10:35

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

3
ответ дан 07.12.2019, 10:35

Они все опасны для выполненного, если у Вас есть каталог в Вашем ПУТИ, который содержит пространство или если название команды содержит пространство:

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

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

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

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

2
ответ дан 07.12.2019, 10:35

Теги

Похожие вопросы