Почему команда Linux wall не передает строковый аргумент?

13

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

# 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?
MBB
источник

Ответы:

21

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

Peth
источник
1
Bash / Zsh имеет другой формат, чтобы избежать echo xxx | yyyсинтаксиса, который я нахожу хитрымwall <<<'your message'
Rich Homolka
Я не уверен насчет этого Rich - синтаксис wall не должен основываться на оболочке, если только нет .bashrc или любого другого эквивалента zsh. Я тоже использую Bash.
Мб
Спасибо, Пит - это синтаксическая организация, которую мне нужно было изучить!
Мб
Моя ошибка, Рич! С разъяснениями wall <<< stringПета я теперь вижу, что вы предлагали синтаксис. Это довольно здорово. <<<Кто-нибудь из вас может объяснить, что именно делает (и почему это будет более эффективно, как сказала Пэт)? Я нахожу странным, что cmd, которому требуется файл, может принять строку после <<<. Еще раз спасибо.
Мб
1
@mjb На самом деле маловероятно, что herestring более эффективна, чем echo - herestrings работают, создавая временный файл, а затем присоединяя его как stdin процесса (дескриптор файла 0), поэтому и wallпринимает его (wall читает из stdin, если вы не указать файл). В качестве способа проверки того, что Herestrings создает файл, $ readlink /proc/self/fd/0 <<< testбудет напечатано что-то вроде /tmp/sh-thd-4228536315 (deleted).
Стюарт П. Бентли
0

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

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

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

мохамадали абаснежад
источник