Проблема заключается в синтаксисе, используемом в связанной статье. Чтобы понять, что именно идет не так, давайте посмотрим на 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
Другой способ - использовать здесь документ. here document
- это конструкция оболочки, которая передает строку (до указанного конечного маркера в отдельной строке) непосредственно на стандартный ввод команды, без промежуточного шага, когда отдельная команда создает такой вывод:
$ wall << .
who's out there?
.
Это было бы "бесполезным использование здесь документов", так как по умолчанию сам терминал будет подключен к стандартному вводу wall
«s и wall
начнет чтение из него до тех пор , пока она не получит конца-файла символ (Ctrl +D):
$ wall
who's out there?
^D
Как отметил Рич Гомолка в комментариях, некоторые оболочки поддерживают here strings
которые позволяют передавать литеральную строку без маркеров команды или конца:
$ wall <<< "who's out there?"
Все подают что-то для стандартного ввода wall
. Разница в том, что конвейер соединяет с ним выходные данные другой команды, тогда как here documents
и here strings
передают строку напрямую. Преимущество последних двух здесь эстетическое, так как команда echo
из примера канала представляет собой встроенную команду оболочки, поэтому она будет оболочкой, обеспечивающей ввод wall
во всех случаях.