В оболочках, поддерживающих здесь строки , включая bash
, zsh
и ] ksh93
, вы можете использовать
wc <<< "apple pear orange"
Два других подхода (которые позволяют вводить несколько строк без дополнительных усилий):
Используйте «здесь документ»:
$ wc << EOF яблоко груша апельсин EOF 1 3 18 $
Строка EOF
является разделителем.
Вы можете использовать любую строку; EOF
- это обычный выбор.
Используйте tty в качестве входных данных:
$ wc яблоко груша апельсин Ctrl + D 1 3 18 $
У этого есть недостаток, заключающийся в том, что программа запускается, и начинает читать ввод, как только вы вводите ее имя. Это может сбивать с толку; например:
$ grep v Быстрая коричневая лиса (напечатано) перепрыгивает через (напечатано) перепрыгивает (Вывод команды grep!) ленивый пес. (напечатано) Ctrl + D (здесь нет вывода) $
Возможно, вы захотите использовать что-то подобное, чтобы ожидать. Ниже приведен простой пример открытия удаленного сеанса telnet, ожидания запроса, отправки некоторых данных, ожидания ответа, сна и выхода.
#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1
Хотя здесь есть несколько правильных решений, другой синтаксис, который иногда может быть полезен, - это выполнение команды в <()
. Это позволит вам создать более одного объекта файлового дескриптора в командной строке.
Это может быть полезно, когда вы делаете что-то вроде сравнения длинных строк текста, или если вы хотите сравнить содержимое, которое не находится в файле.
Например, сравнение файлов hosts на двух узлах без необходимости копировать файл hosts на localhost:
diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')
Символ <
перенаправляет файл на STDIN, а ()
создает подпрограмму для выполнения команды между скобками. Именно STDOUT из подпрограммы передается в STDIN выполняемой команды.
Это более простой способ создать более одного входного "файла" для команды, чем пытаться использовать несколько here docs, или пытаться передать несколько команд в конвейер для конечной команды.