12

Я читал здесь, что это должно работать, но это не так:

# usage: wall [file]
root@sys:~> mesg
is y

root@sys:~> wall "who's out there"
wall: can't read who's out there.

Если mesg установлен на y , что мешает мне транслировать строку? Обратите внимание, я подтвердил, что опция файла работает:

root@sys:~> wall test
Broadcast Message from root@sys (/dev/pts/1) at 15:23 ... 
Who's out there?

2 ответа2

20

Проблема заключается в синтаксисе, используемом в связанной статье. Чтобы понять, что именно идет не так, давайте посмотрим на 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 во всех случаях.

0

попробуй с рутом

root@username:~# wall /home/username/yourfile_name 

если ваш файл находится в домашнем каталоге, в противном случае попробуйте другой путь

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .