Il problema sta nella sintassi utilizzata nell'articolo collegato. Per capire esattamente cosa va storto, diamo un'occhiata a man wall
:
Utilizzo da man wall
:
wall [file]
Wall displays the contents of file or, by default, its standard input
Quindi wall
accetta uno dei due di due fonti per il suo messaggio.
Argomento nome file
Qualsiasi argomento della riga di comando dato a wall
deve essere un nome di file. Poiché non esiste un modo affidabile per stabilire se l'argomento è inteso come messaggio o nome file, wall
presumerà che sia quest'ultimo, ignorerà tutto ciò che arriva sullo standard input e proverà a leggere il messaggio da quel file.
Nel caso specifico, tenta di leggere dal file who's out there
e non lo trova. Si noti che la lettura da un file è generalmente limitata al superutente. Se avessi eseguito wall "who's out there"
come utente non privilegiato, probabilmente il suo output sarebbe stato wall: will not read who's out there - use stdin.
Immissione standard
Se non ottiene un argomento del nome file sulla sua riga di comando, inizierà a leggere dall'input standard. Esistono diversi modi per fornire informazioni all'input standard di un comando. Uno è usare una pipe UNIX. Una pipeline collegherà l'output standard del suo comando di sinistra all'input standard del suo comando di destra:
$ echo "who's out there" | wall
Un altro modo è usare un here document. Un here document
è un costrutto di shell che passa una stringa (fino a un indicatore di fine specificato su una riga a sé stante) direttamente all'input standard di un comando, senza che il passaggio intermedio di avere un comando distinto produca quell'output:
$ wall << .
who's out there?
.
Questo sarebbe un "uso inutile dei documenti qui", perché per impostazione predefinita il terminale stesso sarà connesso a wall
input standard di e wall
inizierà a leggerlo finché non riceverà un carattere di fine file (Ctrl+D ):
$ wall
who's out there?
^D
Come ha notato Rich Homolka nei commenti, alcune shell supportano here strings
che consentono di passare una stringa letterale senza marcatori di comando o di fine:
$ wall <<< "who's out there?"
Tutti danno qualcosa a wall
è l'input standard. La differenza è che una pipeline collega ad essa l'output di un altro comando, mentre here documents
e here strings
passare direttamente la stringa. Il vantaggio di questi ultimi due qui è estetico, come il echo
comando dall'esempio pipe è un comando integrato nella shell, quindi sarà la shell che fornisce wall
in tutti i casi.