O problema está na sintaxe usada no artigo vinculado. Para entender o que exatamente dá errado, vamos dar uma olhada man wall:
Uso de man wall:
wall [file]
Wall displays the contents of file or, by default, its standard input
Portanto, wallaceita uma das duas fontes para sua mensagem.
Argumento do nome do arquivo
Qualquer argumento de linha de comando fornecido walldeve ser um nome de arquivo. Como não há uma maneira confiável de saber se o argumento é como nome da mensagem ou do arquivo, wallele assumirá que é o último, ignora qualquer coisa que esteja na entrada padrão e tenta ler a mensagem desse arquivo.
Nesse caso, ele tenta ler o arquivo who's out theree não o encontra. Observe que a leitura de um arquivo geralmente é restrita ao superusuário. Se você tivesse executado wall "who's out there"como um usuário sem privilégios, provavelmente sua saída teria sido,wall: will not read who's out there - use stdin.
Entrada padrão
Se ele não receber um argumento de nome de arquivo em sua linha de comando, começará a ler a partir da entrada padrão. Existem várias maneiras de alimentar informações com a entrada padrão de um comando. Uma é usar um canal UNIX . Um pipeline conectará a saída padrão do seu comando do lado esquerdo à entrada padrão do seu comando do lado direito:
$ echo "who's out there" | wall
Outra maneira é usar um documento aqui . A here documenté uma construção de shell que passa uma string (até um marcador final especificado em uma linha própria) diretamente para a entrada padrão de um comando, sem que a etapa intermediária de um comando distinto produza essa saída:
$ wall << .
who's out there?
.
Isso seria um "uso inútil dos documentos aqui", porque, por padrão, o próprio terminal será conectado à wallentrada padrão do e wallcomeçará a ler até receber um caractere de fim de arquivo ( Ctrl+D):
$ wall
who's out there?
^D
Como Rich Homolka observou nos comentários, alguns shells suportam o here stringsque permite passar uma string literal sem marcadores de comando ou final:
$ wall <<< "who's out there?"
Todos alimentam algo com walla entrada padrão. A diferença é que um pipeline conecta a saída de outro comando a ele, while here documentse here stringspassa a string diretamente. A vantagem das duas últimas aqui é estética, já que o echocomando do exemplo de pipe é um comando interno do shell, portanto será o shell que fornece walla entrada em todos os casos.
echo xxx | yyysintaxe, o que eu acho cludgywall <<<'your message'