Простой ответ

Простой ответ

У меня проблемы с командами xargsи pipe. Вот один пример =

echo 'a' | xargs mkdir

Эта команда создает каталог с именем a. Так что я могу понять, что эта команда эквивалентнаmkdir a

Но почему эта команда не работает = echo 'a' | mkdir?

Я прочитал, что pipeкоманда передает вывод левой команды в качестве входных данных правой, когда | xargsкоманда передает вывод левой команды в качестве аргумента правой.

1-В чем разница между входными данными и аргументами?

2- echo 'a' | mkdirпочему эта команда не работает и что является эквивалентом этой команды?

Спасибо...

решение1

Простой ответ

Аргументы являются входными данными.

Более длинный ответ

Существуют также и другие типы входных данных.

В вашем примере echo 'a' | mkdirвы ожидаете mkdirпрочитать его стандартный ввод. Однако mkdirон не написан для этого.

То, что вы называете вводом, — это стандартный ввод ( stdin). А вывод — это стандартный вывод ( stdout). Есть все стандартные ошибки ( stderr). И код выхода.

Еще более длинный ответ — так в чем же разница?

Аргументы должны быть доступны до запуска программы. Обычно это: короткий; содержит опции, имена файлов и короткий текст.

В стандартный вход можно записывать данные во время работы программы; в него можно отправлять данные, которых не было при запуске программы; Не гарантируется, что вы сможете прочитать его в произвольном порядке (поэтому читайте его последовательно); Он может быть произвольной длины; На каждый процесс существует только один стандартный вход, если вам нужно больше имен файлов, отправьте их в качестве аргументов;

Как обойтись echo 'a' | xargs mkdirбезxargs

mkdir "$(echo 'a')"

Средства $()запускают содержащуюся команду, а затем заменяют $()ее содержимое стандартным выводом этой команды.

решение2

Я тоже долгое время был в замешательстве по этому поводу. Возьму немного более простой пример (я далеко не эксперт по bash):

wc "test" 
wc <<< "test" (same as: echo "test" | wc)

Результат этих двух команд очень разный. Первая пытается прочитать файл test, вторая показывает 1 1 5.

Проблема здесь в том, что wc "test"получаетаргумент "test"в качестве входных данных, в то время как wc <<< "test"принимаетстандартный ввод.


Поэтому, когда вы запускаете echo 'a' | xargs mkdir(xargs означает: выполнить как аргумент), вы передаетеаргументк mkdir; это как сделать: mkdir a.

С другой стороны, когда вы выдаете echo 'a' | mkdir(проще было бы : mkdir <<< 'a'), вы передаете данные aкак stdin.

mkdirотносится к этим вещам совершенно по-разному, отсюда и результат, который вы видите.

Связанный контент