Проблема заключается в синтаксисе, используемом в связанной статье. Чтобы понять, что именно идет не так, давайте посмотрим на man wall
:
Использование от man wall
:
wall [file]
Wall displays the contents of file or, by default, its standard input
Так что wall
принимает любой из двух источников для своего сообщения.
Аргумент имени файла
Любой заданный аргумент командной строки wall
должен быть именем файла. Поскольку не существует надежного способа определить, подразумевается ли аргумент в качестве имени сообщения или файла, wall
он предположит, что это последнее, игнорирует все, что поступает при стандартном вводе , и попытается прочитать сообщение из этого файла.
В данном случае он пытается прочитать файл who's out there
и не находит его. Обратите внимание, что чтение из файла обычно ограничено суперпользователем. Если бы вы работали wall "who's out there"
как непривилегированный пользователь, скорее всего, его вывод был быwall: will not read who's out there - use stdin.
Стандартный ввод
Если он не получает аргумент имени файла в своей командной строке, он начнет чтение из стандартного ввода. Существует несколько способов подачи информации на стандартный ввод команды. Одним из них является использование канала UNIX . Конвейер соединит стандартный вывод своей команды на левой стороне со стандартным вводом своей команды на правой стороне:
$ echo "who's out there" | wall
Другой способ - использовать здесь документ . A here document
представляет собой конструкцию оболочки, которая передает строку (до указанного конечного маркера в отдельной строке) непосредственно на стандартный ввод команды, без промежуточного шага, когда отдельная команда создает такой вывод:
$ wall << .
who's out there?
.
Это было бы «бесполезным использованием здесь документов», потому что по умолчанию сам терминал будет подключен к wall
стандартному вводу России и wall
начнет читать с него, пока не получит символ конца файла ( Ctrl+D):
$ wall
who's out there?
^D
Как отметил Рич Хомолка в комментариях, некоторые оболочки поддерживают here strings
возможность передачи буквенной строки без маркеров команды или конца:
$ wall <<< "who's out there?"
Все подают что-то для wall
стандартного ввода. Разница в том, что конвейер соединяет с ним выходные данные другой команды here documents
и here strings
передает строку напрямую. Преимущество последних двух здесь эстетическое, так как echo
команда из примера канала представляет собой встроенную команду оболочки, поэтому она будет оболочкой, обеспечивающей wall
ввод во всех случаях.
echo xxx | yyy
синтаксиса, который я нахожу хитрымwall <<<'your message'
wall <<< string
Пета я теперь вижу, что вы предлагали синтаксис. Это довольно здорово.<<<
Кто-нибудь из вас может объяснить, что именно делает (и почему это будет более эффективно, как сказала Пэт)? Я нахожу странным, что cmd, которому требуется файл, может принять строку после<<<
. Еще раз спасибо.wall
принимает его (wall читает из stdin, если вы не указать файл). В качестве способа проверки того, что Herestrings создает файл,$ readlink /proc/self/fd/0 <<< test
будет напечатано что-то вроде/tmp/sh-thd-4228536315 (deleted)
.попробуй с рутом
если ваш файл находится в домашнем каталоге, в противном случае попробуйте другой путь
источник