Проблема полягає у синтаксисі, який використовується у зв’язаній статті. Щоб зрозуміти, що саме йде не так, давайте подивимось 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'