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 ksh93Sie exec 3< some-filezum 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 cmd1oder cmd2auf 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:
xtermmit seiner -SOption
qemu für verschiedene Dinge
flock (um eine Datei auf dem fd des Anrufers zu sperren)
- der
testBefehl aka [für seine -tOption (OK, das testDienstprogramm ist heutzutage in den meisten Bourne-ähnlichen Shells enthalten, aber es gibt immer noch einen testBefehl, 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.
gpgoder opensslan 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 diffund 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).