Auf der `exec FD>`-Form von exec

Auf der `exec FD>`-Form von exec

Ich kann in der zshManpage nichts finden, das genau erklärt, was das Folgende (zum Beispiel) bewirkt

exec 3> /tmp/foo

Die gesamte Dokumentation, die ich finden kann, execbezieht sich auf die Form, in der execein „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/fooin 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/fooein 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/fooausgewertet wird, während der, der nach, sagen wir, passiert, exec datenicht 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/foobedeutet Folgendes:

  1. Erstellen Sie einen Unterprozess.
  2. /tmp/fooZum Schreiben auf Dateideskriptor 3 im Unterprozess öffnen .
  3. Führen Sie die Datei /bin/somecommandim Unterprozess aus.

exec 3>/tmp/fooführt nur Schritt 3 aus, es wird nichts an den Prozessen geändert.

Nach exec 3>/tmp/foowerden alle nachfolgenden Zugriffe auf Dateideskriptor 3 von der Shell und ihren Unterprozessen aus /tmp/foowie 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

verwandte Informationen