Wie kann man den Befehl "cat> file_name << blah" verstehen?

13

Im folgenden Befehl nimmt cat den Inhalt von here-doc und leitet ihn in die Datei conf um:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

Wie kann man hier die Reihenfolge der Befehle verstehen? Gibt es basherste Verfahren alles andere (hier-doc Teil) und als letzten Schritt den aussieht > confTeil?

Martin
quelle

Antworten:

17

Here-Document ist eine Art Shell-Umleitung, sodass die Shell diese als normale Umleitung vom Anfang bis zum Ende (oder von links nach rechts oder in der Reihenfolge der Darstellung) ausführt. Dies wird von POSIX definiert:

Wenn mit einem Befehl mehr als ein Umleitungsoperator angegeben wird, erfolgt die Auswertung in der Reihenfolge von Anfang bis Ende.


In Ihrem Befehl, catwird ausführen > conferste, offene und truncate confDatei zum Schreiben, dann Lesen von Daten aus Here-Document.

Mit stracekönnen Sie Folgendes überprüfen:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...
cuonglm
quelle
Aha. Also passiert im Grunde, cat > file_name << blahdass vor der Ausführung catdie stdout der Shell mit der Datei named verbunden wird file_nameund dann die stdin der Shell mit here-doc verbunden wird ?
Martin
@ Martin: Ja. Sie können sehen, openwurde vor gerufen dup2.
Dienstag,
12

Nun, lassen Sie uns herausfinden:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

Dang. Ich denke, es muss dann zuerst den >"$file"Teil erledigen. Aber was wenn...?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

...kein Fehler...?

cat ./myfile

this is in ./myfile

Wie es scheint, ist die Reihenfolge wichtig.

mikeserv
quelle
-1

Wenn bashder auszuführende Prozess erstellt wird cat, wird er confzum Schreiben in Dateideskriptor 1 geöffnet, und zuvor wird eine temporäre Datei (für das Here-Dokument) zum Lesen in Dateideskriptor 0 geöffnetexec das Programm gestartet wird. In diesem Fall spielt es keine Rolle, in welcher Reihenfolge diese Aktionen ausgeführt werden.

Die Reihenfolge wird wichtig, wenn Dateideskriptoren neu zugewiesen werden, z 2>&1. B. mit .

Toby Speight
quelle