Es gibt ein Flag, das Sie für einen Dateideskriptor setzen können (bei open()
: O_CLOEXEC oder höher mit fcntl()
: FD_CLOEXEC), wenn Sie nicht möchten, dass fd an ausgeführte Befehle übergeben wird.
Dies sollten Sie für Ihre internen Dateideskriptoren tun, wenn Sie Befehle ausführen möchten.
In Muscheln ist es das, was ksh93
Sie exec 3< some-file
zum Beispiel tun . Für andere Shells oder FDS, mit denen geöffnet wurde { cmd1; cmd2; } 3< file
, müssen Sie von Hand schließen, wenn Sie nicht möchten cmd1
oder cmd2
auf dieses Fd zugreifen möchten : {cmd1 3<&-; cmd2; } 3< file
. Das ist eine gute Übung, wird aber nicht immer befolgt, da es normalerweise nicht kritisch ist, wenn Sie es nicht tun .
Nun, ob die Funktion nützlich ist. Ja, mehrere Befehle hängen davon ab.
Einige Befehle verwenden einen Dateideskriptor als Argument, das von einem Aufrufer geöffnet werden soll. Einige Beispiele, die mir in den Sinn kommen:
xterm
mit seiner -S
Option
qemu
für verschiedene Dinge
flock
(um eine Datei auf dem fd des Anrufers zu sperren)
- der
test
Befehl aka [
für seine -t
Option (OK, das test
Dienstprogramm ist heutzutage in den meisten Bourne-ähnlichen Shells enthalten, aber es gibt immer noch einen test
Befehl, der ausgeführt werden kann).
dialog
benötigt Dateideskriptoren für die Eingabe vom Benutzer, die Ausgabe und den Fehler für den Benutzer sowie die Eingabe und Ausgabe für den Aufrufer, sodass Sie dafür zusätzliche fds verwenden können.
gpg
oder openssl
an die Sie einen Dateideskriptor angeben können, um die Passphrase oder andere Informationen zu kommunizieren.
Es gibt eine Reihe von Helfer - Dienstprogramme (zum Beispiel die Notwendigkeit, ausführen könnte einen Teil eines Befehls als ein anderer Benutzer oder eine Gruppe mit einem setuid / setgid ausführbare Datei ausgeführt werden ) , die sich darauf verlassen.
Prozesssubstitution beruht darauf:
In ,, diff <(cmd1) <(cmd2)
werden 2 Dateideskriptoren (an Pipes) übergeben diff
und diff greift auf sie zu, indem sie über das als Argument übergebene spezielle / dev / fd / n geöffnet werden.
Bei Shells ohne Prozessersetzung tun Sie dasselbe von Hand mit folgenden Dingen:
cm1 | { cmd2 | diff /dev/fd/3 -; } 3<&0
closefrom(2)
Anruf).