Я пытаюсь вставить строку trythis
в созданный мной скрипт, который создает каталог, используя то, что написано после него. Например, это работает:
~$ sh ./script trythis
Но использование канала не работает. Я довольно новичок в написании сценариев, поэтому все еще изучаю различные концепции
Каналы соединяют поток stdin самой правой команды в конвейере с stdout самой левой команды. Эффект такой, как будто одна команда становится клавиатурным вводом для другой.
В отличие от позиционных параметров, как в
myscript.sh trythis
, создать массив значений, где myscript и trythis являются элементами в этом массиве, и вообще нет никакой связи с потоком stdin. В таких случаях вы должны использовать xargs
echo trythis | xargs myscript
Команда xargs
будет запускать команду myscript
с добавлением trythis
вперед, как если бы это было сделано вручную.
Другими словами, именно потому, что sh ./script trythis
ожидает, что trythis
будет в списке позиционных параметров, вы не видите echo trythis | sh ./myscript
работающего. Если бы вы сделали echo try this | sh ./myscript trythis
, это сработало бы, потому что теперь у вас есть список позиционных параметров, и эхо технически становится избыточным.
Конечно, это собственное решение приложения о том, что делать с stdin или позиционными параметрами. Такие команды, как echo
, не заботятся о stdin, а только о позиционных параметрах, тогда как cat
заботятся об обоих. Если бы вы собирали сценарий таким образом, чтобы он читал stdin и принимал позиционные параметры, то он также мог бы работать, например, grep
и tail
это делают. И именно в тех случаях, когда мы хотим динамически создавать позиционные параметры или приложение игнорирует стандартный ввод данных - есть подходящее место для использования xargs
.