Problem leży w składni użytej w połączonym artykule. Aby zrozumieć, co dokładnie idzie nie tak, spójrzmy na man wall
:
Zastosowanie od man wall
:
wall [file]
Wall displays the contents of file or, by default, its standard input
wall
Przyjmuje więc jedno z dwóch źródeł wiadomości.
Argument nazwy pliku
Dowolny podany argument wiersza poleceń wall
musi być nazwą pliku. Ponieważ nie ma wiarygodnego sposobu, aby stwierdzić, czy argument ma oznaczać wiadomość lub nazwę pliku, wall
przyjmie, że jest to ta ostatnia, zignoruje wszystko przychodzące na standardowe wejście i spróbuje odczytać wiadomość z tego pliku.
W danym przypadku próbuje odczytać z pliku who's out there
i nie znajduje go. Pamiętaj, że odczyt z pliku jest zwykle ograniczony do administratora. Gdybyś był wykonany wall "who's out there"
jako użytkownik nieuprzywilejowany, prawdopodobnie jego wyniki byłyby,wall: will not read who's out there - use stdin.
Standardowe wejście
Jeśli nie otrzyma argumentu nazwy pliku w wierszu poleceń, rozpocznie czytanie ze standardowego wejścia. Istnieje kilka sposobów przekazywania informacji do standardowego wejścia komendy. Jednym z nich jest użycie potoku UNIX . Potok połączy standardowe wyjście polecenia po lewej stronie ze standardowym wejściem polecenia po prawej stronie:
$ echo "who's out there" | wall
Innym sposobem jest użycie dokumentu tutaj . A here document
jest konstrukcją powłokową, która przekazuje ciąg znaków (do określonego znacznika końcowego we własnej linii) bezpośrednio do standardowego wejścia polecenia, bez pośredniego kroku posiadania odrębnego polecenia generującego ten wynik:
$ wall << .
who's out there?
.
Byłoby to „bezużyteczne użycie tutaj dokumentów”, ponieważ domyślnie sam terminal zostanie podłączony do wall
standardowego wejścia i wall
zacznie z niego czytać, dopóki nie otrzyma znaku końca pliku ( Ctrl+D):
$ wall
who's out there?
^D
Jak zauważył Rich Homolka w komentarzach, niektóre powłoki obsługują, here strings
które pozwalają na przekazanie dosłownego ciągu znaków bez poleceń lub znaczników końcowych:
$ wall <<< "who's out there?"
Wszystkie przesyłają coś do wall
standardowego wejścia. Różnica polega na tym, że potok łączy z nim dane wyjściowe innego polecenia here documents
i here strings
przekazuje ciąg bezpośrednio. Zaletą tych dwóch ostatnich jest tutaj walor estetyczny, ponieważ echo
polecenie z przykładu potoku jest wbudowanym poleceniem powłoki, więc będzie powłoką zapewniającą wall
dane wejściowe we wszystkich przypadkach.
echo xxx | yyy
składni, co uważam za niepotrzebnewall <<<'your message'