Problém spočívá v syntaxi použité v odkazovaném článku. Abychom pochopili, co přesně se pokazilo, podívejme se na man wall
:
Použití od man wall
:
wall [file]
Wall displays the contents of file or, by default, its standard input
Takže wall
přijímá buď ze dvou zdrojů pro jeho zprávu.
Argument názvu souboru
Libovolný argument příkazového řádku daný wall
musí být název souboru. Protože neexistuje spolehlivý způsob, jak zjistit, zda je argument míněn jako zpráva nebo název souboru, wall
bude předpokládat, že je to to druhé, bude ignorovat vše, co přichází na standardním vstupu, a pokusí se přečíst zprávu z tohoto souboru.
V daném případě se pokusí načíst ze souboru who's out there
a nenajde to. Všimněte si, že čtení ze souboru je obvykle omezeno na superuživatele. Pokud jste spustili wall "who's out there"
jako neprivilegovaného uživatele by jeho výstup pravděpodobně byl wall: will not read who's out there - use stdin.
Standardní vstup
Pokud na příkazovém řádku neobdrží argument názvu souboru, začne číst ze standardního vstupu. Existuje několik způsobů, jak vložit informace do standardního vstupu příkazu. Jedním z nich je použití potrubí UNIX. Potrubí propojí standardní výstup příkazu na levé straně se standardním vstupem příkazu na pravé straně:
$ echo "who's out there" | wall
Dalším způsobem je použití dokumentu zde. A here document
je konstrukce shellu, která předává řetězec (až po zadanou koncovou značku na vlastním řádku) přímo standardnímu vstupu příkazu, aniž by mezikrok spočívající v tom, že by tento výstup vytvořil samostatný příkaz:
$ wall << .
who's out there?
.
To by bylo "zbytečné použití zde dokumentů", protože ve výchozím nastavení bude samotný terminál připojen k wall
standardní vstup a wall
začne z něj číst, dokud neobdrží znak konce souboru (Ctrl+D ):
$ wall
who's out there?
^D
Jak poznamenal Rich Homolka v komentářích, některé shelly podporují here strings
které umožňují předání doslovného řetězce bez příkazu nebo koncových značek:
$ wall <<< "who's out there?"
Všichni dávají něco do wall
standardní vstup. Rozdíl je v tom, že potrubí k němu připojuje výstup jiného příkazu, zatímco here documents
a here strings
předat řetězec přímo. Výhoda posledně jmenovaných dvou je zde estetická, jako echo
příkaz z příkladu roury je vestavěný příkaz shellu, takže to bude shell poskytující wall
vstup 's ve všech případech.