Ich kann in der zsh
Manpage nichts finden, das genau erklärt, was das Folgende (zum Beispiel) bewirkt
exec 3> /tmp/foo
Die gesamte Dokumentation, die ich finden kann, exec
bezieht sich auf die Form, in der exec
ein „einfacher Befehl“ folgt. (Siehe z. B.man zshbuiltins
, Undman zshmisc
.) (Das exec FD>
Formular wird kurz erwähnt inman zshmisc
, aber in einer Passage, die meiner Ansicht nach davon ausgeht, dass diese Form anderswo vollständig und ordnungsgemäß dokumentiert wurde.)
Ich habe mir alle Hits angesehen von
man zshall | grep -P '\bexec\b'
…aber keines war das, was ich suchte.
Kennt jemand einen guten Ersatz für die fehlenden Unterlagen?
PS: Eine mögliche Erklärung für das, was mir wie "fehlende Dokumentation" vorkommt, ist, dass Formulare wie exec 3> /tmp/foo
in Wirklichkeit Sonderfälle des Formulars "exec
einfacher Befehl". Wenn dies jedoch so ist, dann würde ich gerne eine Dokumentation finden, die erklärt (1) wie zB 3> /tmp/foo
ein einfacher Befehl ist (wenn ich diesen „einfachen Befehl“ in der Befehlszeile ausführe, bleibt er einfach hängen, bis ich drücke ^C
); und (2) warum Code in einem Skript, der nach etwas wie passiert, exec 3> /tmp/foo
ausgewertet wird, während der, der nach, sagen wir, passiert, exec date
nicht ausgewertet wird.
Antwort1
Die Bedeutungen von exec
„mit“ und „ohne“ haben nichts miteinander zu tun. Ich vermute, der eingebaute Name ist überladen, weil eine Bedeutung mit einem Befehl keinen Sinn ergibt und die andere ohne Befehl keinen Sinn. Auf diese Weise musste man sich also keinen neuen Namen ausdenken, der dann für einen anderen Befehl nicht verwendbar wäre.
DerHandbuchZustände:
WennBefehlweggelassen wird, aber Weiterleitungen angegeben sind, werden die Weiterleitungen in der aktuellen Shell wirksam.
Das bedeutet, dass etwas wie exec 3> /tmp/foo
ändert, worauf Dateideskriptor 3 im laufenden Shell-Prozess verweist. Ein Shell-Ausschnitt wie /bin/somecommand 3>/tmp/foo
bedeutet Folgendes:
- Erstellen Sie einen Unterprozess.
/tmp/foo
Zum Schreiben auf Dateideskriptor 3 im Unterprozess öffnen .- Führen Sie die Datei
/bin/somecommand
im Unterprozess aus.
exec 3>/tmp/foo
führt nur Schritt 3 aus, es wird nichts an den Prozessen geändert.
Nach exec 3>/tmp/foo
werden alle nachfolgenden Zugriffe auf Dateideskriptor 3 von der Shell und ihren Unterprozessen aus /tmp/foo
wie bei jeder anderen Umleitung an weitergeleitet. Angenommen, Sie führen das folgende Skript in einem Terminal aus, ohne dass eine Verbindung zum Dateideskriptor 3 besteht:
echo hello # prints to the terminal
echo nope >&3 # complains about a bad descriptor since no file is open on fd 3
exec >/tmp/out 3>/tmp/three
echo hello # writes to /tmp/out
echo howdy >&3 # writes to /tmp/three
echo wibble >&3 # writes a second line to /tmp/three