Kann man mehrere here-docs verwenden, um einen Befehl in bash einzugeben?
$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar
Offensichtlich wird in beiden Fällen der zweite Here-Doc als Standard verwendet und ersetzt den ersten Verweis. Ist die Lösung, echo
stattdessen s zu verwenden?
$ cat <(echo -n foo) <(echo bar)
foobar
Aus irgendeinem Grund hat die Verwendung einer Kombination auch bei mir nicht funktioniert. Warum sollte das so sein?
$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo
bash
io-redirection
here-document
Sparhawk
quelle
quelle
paste
mit Dummy-Eingängen getestet habe . Ich denke, ich kann mir ein paar andere Szenarien vorstellen. Wenn ich ein Skript mit vorab manipuliertem Text in einigen Variablen gehabt hätte, dann möchte ich vielleicht mit einem Befehl, der nur Dateien akzeptiert, etwas mit beiden machendiff
.cat <<EOF1 <<"EOF2"
.Antworten:
Du kannst tun:
Es kann nur eine Standardeingabe geben, da es nur einen Dateideskriptor 0 gibt.
Kurzform für:
Und:
ist:
Sie müssen sich überlegen, was in Dateideskriptor 0 geöffnet werden soll.
Ist:
Wo
123
ist ein Dateideskriptor zu einer Pipe, und parallel dazu wird Bashecho foo
in einem anderen Prozess ausgeführt, wobei die stdout zum anderen Ende der Pipe umgeleitet wird.Sobald Sie einen Dateinamen an übergeben
cat
, wirdcat
nicht mehr von stdin gelesen. Sie brauchen:Oder:
(
-
ist zu erzählencat
von stdin zu lesen).quelle
cat <<EOF
ist nicht genau das gleiche wiecat /dev/fd/0...
: in letzterem Fallcat
sieht der Dateiname und macht das Öffnen.cat
von seinerfd
0 gelesen , als ob ein Argument von-
oder übergeben wurde/dev/fd/0
(obwohl das Öffnen unter Linux (und nur unter Linux)/dev/fd/0
nicht genau dem Duplizieren des Dateideskriptors 0 gleicht)./dev/fd/3 3<< E1
Konstrukt hat mich sehr überrascht und ich frage mich, was genau unter / dev / fd / steht. Obwohl sie irgendwie magisch erscheinen, nachdem der Prozess eine Datei irgendwo im Dateisystem geöffnet hat, mit Ausnahme von 1 und 2, die standardmäßig für jeden Prozess vorhanden sind. In Ihrem Beispiel verwenden Sie jedoch die Dateideskriptoren 3 und 4, die mit Ausnahme dieser Eingabeumleitung mit keiner echten Datei verbunden sind. Das kann ich in meinem mentalen Modell der Dateideskriptoren nicht nachvollziehen. Was ist, wenn Prozess eine andere Datei öffnen möchte, würde er wissen, dass er fd 5 verwenden muss? Müssen FDS 3, 4, 5 sein ... oder kann es irgendetwas sein?