У меня проблемы с командами 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
относится к этим вещам совершенно по-разному, отсюда и результат, который вы видите.