Как я могу отправить символы в команду, как если бы они пришли из файла?
Например я попробовал:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
В оболочках, которые поддерживают здесь строки , в том числе bash
, zsh
и ksh93
вы можете использовать
wc <<< "apple pear orange"
Два других подхода (которые допускают многострочный ввод без дополнительных усилий):
Используйте «здесь документ»:
EOF
Строка является разделителем. Вы можете использовать любую строку;EOF
это просто обычный выбор.Используйте tty в качестве ввода:
Это имеет тот недостаток, что программа запускается и начинает читать ввод, как только вы набираете его имя. Это может сбивать с толку; например:
источник
<<<
Форма также допускает многострочный ввод без лишних усилий, так как"
строка -enclosed может содержать символы новой строки. Конечно,<< EOF
форму (оригинальный синтаксис here-doc) легче читать, если у вас есть многострочный ввод.<<<
word
- конечно, в контексте оболочки, aword
может быть строкой в кавычках, содержащей пробелы и переводы строки! D'о! Это настолько очевидно, что само собой разумеется (и, на самом деле, я вообще не вижу этого упоминания на странице руководства). :-( Спасибо, что указал мне на это!word
определяется на странице руководства как «последовательность символов, рассматриваемая оболочкой как единое целое» (или «токен»), и вам необходимо знать, что строки в кавычках обрабатываются как «единичная единица» в соответствующем смысле (после обработка обратной косой черты, расширение переменных и т. д. «Но на самом деле в этом и заключается цель двойных кавычек в оболочке. (Одиночные кавычки также защищают от расширения.) Модель обработки оболочки очень хорошо продумана и совсем не проста.Хотя здесь есть несколько допустимых решений, другой синтаксис, который иногда может быть полезен, - запустить команду
<()
. Это позволит вам создать более 1 объекта дескриптора файла в командной строке.Это может быть полезно, когда вы делаете что-то вроде сравнения длинных строк текста, или если вы хотите просмотреть какой-либо контент, которого нет в файле.
Например, сравнивая файлы hosts на двух узлах без необходимости копировать файл hosts на локальный хост:
<
Перенаправляет файл STDIN и()
создать подоболочку для запуска команды между скобками. Это STDOUT из подоболочки, который передается в STDIN запускаемой команды.Это более простой способ создать более 1 входного «файла» для команды, чем пытаться использовать несколько приведенных здесь документов или пытаться отобразить несколько команд в конвейере для последней команды.
источник
<fileorpathname
перенаправляет стандартный ввод, но<(subcmd)
не делает; он заменяет имя, которое при открытии программой может прочитать стандартный вывод из subcmd.< <(subcmd)
(требуется место) перенаправляет стандартный ввод из этого файла, почти какsubcmd |
. Выdiff
могли бы прочитать один из его входных данных из stdin, указав аргумент,-
но не оба.cmd <(cmd2 ...)
иcmd < <(cmd2 ...)
. Первый позволяет использовать производные данные (вывод cmd2) вместо имени файла. Последнее эквивалентноcmd2 ... | cmd
. Команды должны быть написаны так, чтобы явно принимать ввод stdin, а многие нет. Это особенно верно для сценариев оболочки.Вы можете использовать трубу
источник
Вы можете использовать что-то похожее, чтобы ожидать. Ниже приведен простой пример открытия удаленного сеанса telnet, ожидания запроса, отправки некоторых данных, ожидания ответа, ожидания и выхода.
источник