Чому команда Linux wall 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?

Відповіді:


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у всіх випадках.


1
Bash / zsh має інший формат, щоб уникнути echo xxx | yyyсинтаксису, який я вважаю незграбнимwall <<<'your message'
Rich

Я не впевнений у тому, що один Rich - синтаксис стіни не повинен базуватися на оболонці, якщо не існує .bashrc або інший zsh-еквівалент. Я також використовую bash.
mbb

Дякую peth - ось синтаксична організація, яку мені потрібно було навчитися!
mbb

Моя помилка Річ! З роз'ясненням Пета я бачу, що ви пропонували wall <<< stringсинтаксис. Це досить чудово. Чи може хтось із вас пояснити, що <<<саме робить (і чому це було б більш ефективно, як сказав Пет)? Мені здається дивним, що cmd, який вимагає файлу, може приймати рядок після <<<. Знову дякую.
mbb

1
@mjb Насправді маловірність є ефективнішою, ніж ехо - herestrings працює, створюючи тимчасовий файл, а потім додаючи це як stdin процесу (дескриптор файлу 0), і саме тому wallйого приймає (стіна читається зі stdin, якщо ти не робиш ' t вкажіть файл). Як спосіб перевірити, що герестрінг створює файл, $ readlink /proc/self/fd/0 <<< testнадрукує щось подібне /tmp/sh-thd-4228536315 (deleted).
Стюарт П. Бентлі

0

спробуйте з коренем

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

якщо ваш файл знаходиться в домашній директорії, інакше спробуйте інший шлях

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.