Почему это не работает: ~ $ echo & ldquo; trythis & rdquo; | sh ./script.sh

Я пытаюсь вставить строку trythis в созданный мной скрипт, который создает каталог, используя то, что написано после него. Например, это работает:

~$ sh ./script trythis

Но использование канала не работает. Я довольно новичок в написании сценариев, поэтому все еще изучаю различные концепции

0
задан 14 April 2019 в 22:40

1 ответ

Поскольку труба и позиционные параметры - это разные вещи

Каналы соединяют поток 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.

0
ответ дан 14 April 2019 в 22:40

Другие вопросы по тегам:

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