Czy istnieje sposób, aby skutecznie to zrobić w bash:
/my/bash/script < echo 'This string will be sent to stdin.'
Zdaję sobie sprawę, że mogę potokować wyjście z echa, takie jak to:
echo 'This string will be piped to stdin.' | /my/bash/script
bash
redirect
stdin
io-redirection
Wszyscy pracownicy są niezbędni
źródło
źródło
echo
>
formularz przekierowania otworzy deskryptor pliku jako fd0
(stdin), podczas gdy|
opens uruchamia proces potomny i dołącza jego standardowe wyjście (fd 1) do wejścia standardowego innego procesu. Fakt ten może mieć niebanalną konsekwencje (pomyśl o dzielenie zmiennych środowiskowych?)Odpowiedzi:
Możesz użyć jednej linii
heredoc
powyższe jest takie samo jak
lub możesz przekierować dane wyjściowe z polecenia, na przykład
lub możesz przeczytać jako
lub po prostu
źródło
echo -e "\x01\x02..." | ./script
)<<<
? Wstydzę się przyznać, że nigdy wcześniej go nie widziałem i jestem tym totalnie zaintrygowany. Próbowałem googlować, ale moje wyniki nie były powiązane.Byłeś blisko
W przypadku wejścia wielowierszowego odpowiednie są dokumenty tutaj:
Edytuj komentarze:
Powiedzmy, aby uzyskać wejście binarne
Jeśli zastąpić
cat
na/my/bash/script
(lub faktycznie spaść ostatnią rurę), to drukuje:Lub, jeśli chcesz czegoś bardziej naukowego:
Który jest sinusem pierwszych 90 stopni w 4-bajtowych liczbach zmiennoprzecinkowych
źródło
xxd -r
(lubod
), aby filtrować tu dokumentMożesz także użyć w
read
ten sposóbźródło
Rozwiązanie
Chcesz (1) utworzyć wyjście stdout w jednym procesie (jak
echo '…'
) i (2) przekierować to wyjście na wejście stdin innego procesu, ale (3) bez użycia mechanizmu potoku bash. Oto rozwiązanie spełniające wszystkie trzy warunki:Jest
<
to normalne przekierowanie wejścia dla wejścia standardowego. Jest<(…)
to podstawienie procesu bash. Z grubsza tworzy/dev/fd/…
plik z wyjściem polecenia podstawiania i przekazuje tę nazwę pliku zamiast<(…)
, co daje na przykładscript < /dev/fd/123
. Aby uzyskać szczegółowe informacje, zobacz tę odpowiedźPorównanie z innymi rozwiązaniami
Jednowierszowy heredoc wysyłany do stdin
script <<< 'string'
pozwala tylko na wysyłanie statycznych łańcuchów, a nie na wyjście innych poleceń.Samo podstawianie procesu, na przykład in
diff <(ls /bin) <(ls /usr/bin)
, nie wysyła niczego na stdin. Zamiast tego dane wyjściowe procesu są przekazywane jako zawartość plików tworzonych w tle, równoważne na przykładdiff /dev/fd/10 /dev/fd/11
. W tym poleceniudiff
nie pobiera danych wejściowych ze standardowego wejścia.Przypadków użycia
Podoba mi się to, w przeciwieństwie do mechanizmu rurowego,
< <(…)
mechanizm pozwala na umieszczenie polecenia na pierwszym miejscu, a wszystkie dane wejściowe po nim, tak jak jest to standard dla danych wejściowych z opcji wiersza poleceń.Jednak poza estetyką wiersza poleceń istnieją przypadki, w których nie można zastosować mechanizmu rurowego. Na przykład, gdy określone polecenie musi zostać podane jako argument do innego polecenia, tak jak w tym przykładzie z
sshpass
.źródło
<<<
?Umożliwia wpisanie wielu wierszy do programu bez zapisywania tych danych wejściowych w historii ani widocznych w
ps
. Aby zakończyć pisanie, po prostu naciśnij Ctrl + C po zakończeniu pisaniacat
.źródło
źródło
function oline() { sed -e ":a;N;\$!ba ;s?\n? ?g"; }
. Po trzecie, ten sed byłby o wiele bardziej zrozumiały z awk:awk -F '\n' 'ORS=" " { print } END { printf "\n"}'