Mit Bash können Sie vor einem Befehl eine umgeleitete Eingabe angeben:
$ <lines sed 's/^/line: /g'
line: foo
line: bar
Mit Bash können Sie Eingaben auch wie eine while
Schleife in einen zusammengesetzten Befehl umleiten :
$ while read line; do echo "line: $line"; done <lines
line: foo
line: bar
Wenn ich jedoch versuche, eine umgeleitete Eingabe vor einer while
Schleife anzugeben , wird ein Syntaxfehler angezeigt:
$ <lines while read line; do echo "line: $line"; done
bash: syntax error near unexpected token `do'
Was ist daran falsch? Ist es nicht möglich, eine umgeleitete Eingabe vor einem zusammengesetzten Befehl in Bash anzugeben? Wenn ja, warum nicht?
bash
shell
io-redirection
Stuart P. Bentley
quelle
quelle
Antworten:
man bash
sagt:while
ist kein einfacher Befehl.quelle
Sie können in
zsh
, nicht inbash
und choroba hat Sie bereits auf die Dokumentation hingewiesen , aber wenn Sie die Umleitung vorher haben möchten, können Sie Dinge tun wie:Oder (auf Systemen mit Unterstützung für
/dev/fd/n
):(Nicht, dass du es tun möchtest).
Sie können auch tun:
(Beachten Sie, dass
exec
das Skript beendet wird, wennfile
es nicht geöffnet werden kann.)Oder verwenden Sie eine Funktion:
quelle
eval
und/dev/fd/
Routen gleich schnell sind.<< EOF
eine temporäre Datei erstellt, abgelegt und dann geöffnet, gelesen und interpretiert, während Sie sie lesen. Es wird bestimmt weniger schnell sein, aber wahrscheinlich nicht merklich, da es sowieso alles im Gedächtnis passieren wird.command exec
kann das Exit-Problem wie mit anderen integrierten Funktionen behandeln. aber es wird viel zu spät, um die reservierten Wortbits zu verarbeiten.Sie können diese Ersetzung verwenden, wenn Sie der Eingabe vorangehen möchten:
quelle
Sie können exec verwenden, um das stdin umzuleiten.
In einem Skript:
Sie können es jedoch nicht in einer Anmeldeshell verwenden (die Datei wird auf dem Standardauszug gespeichert und beendet). In diesem Fall können Sie einen anderen Dateideskriptor öffnen:
Als Referenz: Mit exec
quelle
exec 3<&0
und umgebenexec <&3
, oder? (das oder verwenden Sie & 3 für die Weiterleitung, dh Ihr zweites Beispiel)