Jak mogę wysłać znaki do polecenia tak, jakby pochodziły z pliku?
Na przykład próbowałem:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
W muszli, które obsługują tutaj ciągi , w tym bash
, zsh
i ksh93
można użyć
wc <<< "apple pear orange"
Dwa inne podejścia (które umożliwiają wprowadzanie wielu wierszy bez dodatkowego wysiłku):
Użyj „tutaj dokumentu”:
EOF
Ciąg jest separator. Możesz użyć dowolnego ciągu;EOF
jest tylko konwencjonalnym wyborem.Użyj tty jako danych wejściowych:
Ma to tę wadę, że program zaczyna działać i zaczyna czytać dane wejściowe, gdy tylko wpiszesz jego nazwę. Może to być niepokojące; na przykład:
źródło
<<<
Formularz umożliwia także wprowadzanie wielu wierszy bez dodatkowego wysiłku, ponieważ"
zamknięty łańcuch może zawierać znaki nowej linii. Oczywiście<< EOF
formularz (oryginalna składnia tutaj-doc) jest łatwiejszy do odczytania, jeśli masz wejście wieloliniowe.<<<
word
- oczywiście w kontekście powłoki, aword
może być ciągiem cytowanym, zawierającym spacje i znaki nowej linii! Nie! Jest to tak oczywiste, że jest oczywiste (i w rzeczywistości nie widzę o tym w ogóle na stronie podręcznika). :-( Dziękujemy za zwrócenie mi uwagi!word
jest zdefiniowane na stronie podręcznika jako „Sekwencja znaków uważanych przez powłokę za pojedynczą jednostkę” (aka „token”), i musisz wiedzieć, że cytowane ciągi znaków są traktowane jako „pojedyncza jednostka” w odpowiednim znaczeniu (po przetwarzanie odwrotnego ukośnika, zmienna ekspansja itp. „Ale to jest właśnie ten cel podwójnego cytowania w powłoce. (Pojedyncze cudzysłowy chronią także przed ekspansją). Model przetwarzania powłoki jest bardzo dobrze przemyślany i wcale nie prosty.Chociaż istnieje tutaj kilka poprawnych rozwiązań, inną składnią, która może być czasem przydatna, jest uruchomienie polecenia
<()
. Umożliwiłoby to utworzenie więcej niż 1 obiektu deskryptora pliku w wierszu polecenia.Może to być przydatne, gdy robisz coś takiego jak porównywanie długich ciągów tekstu lub jeśli chcesz różnicować zawartość, której nie ma w pliku.
Na przykład porównanie plików hosts na dwóch węzłach bez konieczności kopiowania pliku hosts na localhost:
<
Przekierowuje plik do standardowego wejścia i()
tworzyć podpowłoce uruchomić polecenie między nawiasach. Jest to STDOUT z podpowłoki, która jest przekazywana do STDIN uruchamianego polecenia.To łatwiejszy sposób na utworzenie więcej niż 1 wejściowego „pliku” do polecenia niż próba użycia wielu tutaj dokumentów lub próba powtórzenia wielu poleceń w potoku do ostatecznego polecenia.
źródło
<fileorpathname
przekierowuje standardowe wejście, ale<(subcmd)
nie; zastępuje nazwę, która gdy / jeśli zostanie otwarta przez program, może odczytać standardowe wyjście z subcmd.< <(subcmd)
(wymagane miejsce) przekierowuje standardowe wejście z tego pliku, prawie jaksubcmd |
. Możeszdiff
odczytać jeden z jego danych wejściowych ze standardowego wejścia, podając argument,-
ale nie oba.cmd <(cmd2 ...)
icmd < <(cmd2 ...)
. Pierwszy pozwala na wykorzystanie danych pochodnych (danych wyjściowych cmd2) zamiast nazwy pliku. Ten ostatni jest równoważnycmd2 ... | cmd
. Polecenia muszą być napisane, aby jawnie akceptować wejście standardowego wejścia, a wiele z nich nie. Dotyczy to zwłaszcza skryptów powłoki.możesz użyć fajki
źródło
Możesz użyć czegoś podobnego, aby się spodziewać. Poniżej znajduje się prosty przykład otwarcia zdalnej sesji telnet, oczekiwania na monit, wysłania danych, oczekiwania na odpowiedź, uśpienia i wyjścia.
źródło