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, wall
aceita uma das duas fontes para sua mensagem.
Argumento do nome do arquivo
Qualquer argumento de linha de comando fornecido wall
deve 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, wall
ele 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 there
e 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 à wall
entrada padrão do e wall
começ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 strings
que permite passar uma string literal sem marcadores de comando ou final:
$ wall <<< "who's out there?"
Todos alimentam algo com wall
a entrada padrão. A diferença é que um pipeline conecta a saída de outro comando a ele, while here documents
e here strings
passa a string diretamente. A vantagem das duas últimas aqui é estética, já que o echo
comando do exemplo de pipe é um comando interno do shell, portanto será o shell que fornece wall
a entrada em todos os casos.
echo xxx | yyy
sintaxe, o que eu acho cludgywall <<<'your message'
wall <<< string
sintaxe. Isso é ótimo. Algum de vocês pode explicar<<<
exatamente o que está fazendo (e por que seria mais eficiente, como disse peth)? Acho estranho que um cmd que exija um arquivo possa aceitar uma sequência depois<<<
. Obrigado novamente.wall
aceita (o muro lê stdin se você não ' t especifique um arquivo). Como uma maneira de verificar se as herestrings criam um arquivo,$ readlink /proc/self/fd/0 <<< test
imprimirá algo como/tmp/sh-thd-4228536315 (deleted)
.tente com root
se o seu arquivo estiver no diretório inicial, tente outro caminho
fonte