Gibt es eine Möglichkeit, dies in Bash effektiv zu tun:
/my/bash/script < echo 'This string will be sent to stdin.'
Mir ist bewusst, dass ich die Ausgabe des Echos wie folgt weiterleiten könnte:
echo 'This string will be piped to stdin.' | /my/bash/script
bash
redirect
stdin
io-redirection
Alle Arbeiter sind wesentlich
quelle
quelle
echo
>
Umleitungsformular einen Dateideskriptor als fd0
(stdin), während|
opens einen untergeordneten Prozess startet und dessen stdout (fd 1) an das stdin des anderen Prozesses anfügt. Diese Tatsache kann nicht triviale Konsequenzen haben (denken Sie über das Teilen von Umgebungsvariablen nach?)Antworten:
Sie können einzeilig verwenden
heredoc
das obige ist das gleiche wie
oder Sie können die Ausgabe von einem Befehl wie umleiten
oder du kannst lesen als
oder einfach
quelle
echo -e "\x01\x02..." | ./script
)<<<
? Ich schäme mich zuzugeben, dass ich es noch nie gesehen habe, und ich bin total verwirrt darüber. Ich habe versucht, dafür zu googeln, aber meine Ergebnisse haben nichts damit zu tun.Du warst nah
Für mehrzeilige Eingaben eignen sich Here-Docs:
Bearbeiten Zu den Kommentaren:
Um einen Binäreingang zu erreichen, sagen wir
Wenn Sie ersetzen
cat
für/my/bash/script
(oder in der Tat das letzte Rohr fallen), dieser Druck:Oder wenn Sie etwas geekigeres wollten:
Welches ist der Sinus der ersten 90 Grad in 4-Byte-Binär-Floats
quelle
xxd -r
(oderod
) verwenden, um das HIER-Dokument zu filternSie können auch verwenden ,
read
wie diesquelle
Lösung
Sie möchten (1) eine stdout-Ausgabe in einem Prozess erstellen (wie
echo '…'
) und (2) diese Ausgabe auf die stdin-Eingabe eines anderen Prozesses umleiten, jedoch (3) ohne Verwendung des Bash-Pipe-Mechanismus. Hier ist eine Lösung, die alle drei Bedingungen erfüllt:Das
<
ist normal Eingabeumleitung für stdin. Das<(…)
ist Bash-Prozess-Substitution. Etwa erstellt es eine/dev/fd/…
Datei mit der Ausgabe des Ersetzungsbefehls und übergibt diesen Dateinamen anstelle von<(…)
, was hier zum Beispiel zu führtscript < /dev/fd/123
. Einzelheiten finden Sie in dieser AntwortVergleich mit anderen Lösungen
Ein einzeiliger Heredoc, der an stdin geschickt wurde
script <<< 'string'
ermöglicht nur das Senden statischer Zeichenfolgen, nicht die Ausgabe anderer Befehle.Prozesssubstitution allein, wie in
diff <(ls /bin) <(ls /usr/bin)
, sendet nichts an stdin. Stattdessen wird die Prozessausgabe als Inhalt von Dateien übergeben, die im Hintergrund erstellt wurden, was beispielsweise entsprichtdiff /dev/fd/10 /dev/fd/11
. In diesem Befehldiff
wird keine Eingabe von stdin erhalten.Anwendungsfälle
Ich mag das, im Gegensatz zum Rohrmechanismus, dem
< <(…)
den Befehl an erster Stelle und alle Eingaben danach setzt, wie es der Standard für die Eingabe über Befehlszeilenoptionen ist.Über die Kommandozeilenästhetik hinaus gibt es jedoch einige Fälle, in denen ein Rohrmechanismus nicht verwendet werden kann. Zum Beispiel, wenn ein bestimmter Befehl als Argument für einen anderen Befehl angegeben werden muss, wie in diesem Beispiel mit
sshpass
.quelle
<<<
?Ermöglicht es einem, mehrere Zeilen in ein Programm einzugeben, ohne dass diese Eingabe im Verlauf gespeichert oder in angezeigt wird
ps
. Drücken Sie einfach Strg + C, wenn Sie mit der Eingabe fertig sindcat
.quelle
quelle
function oline() { sed -e ":a;N;\$!ba ;s?\n? ?g"; }
. Drittens wäre dieses Sed mit awk viel verständlicher:awk -F '\n' 'ORS=" " { print } END { printf "\n"}'