Gibt es eine Möglichkeit, alle geöffneten Dateideskriptoren zu schließen, ohne vorher eine explizite Liste zu haben?
bash
shell
file-descriptors
Lorenzo Pistone
quelle
quelle
Antworten:
Wörtlich antworten, alle geöffneten Dateideskriptoren schließen für
bash
:Dies ist jedoch keine gute Idee, da dadurch die grundlegenden Dateideskriptoren geschlossen werden, die die Shell für die Eingabe und Ausgabe benötigt. Wenn Sie dies tun, wird bei keinem der von Ihnen ausgeführten Programme die Ausgabe auf dem Terminal angezeigt (es sei denn, sie schreiben
tty
direkt auf das Gerät). Wenn in meinen Tests durch das Schließen vonstdin
(exec 0>&-
) nur eine interaktive Shell beendet wird.Möglicherweise möchten Sie tatsächlich alle Dateideskriptoren schließen, die nicht Teil der Grundoperation der Shell sind. Dies sind 0 für
stdin
, 1 fürstdout
und 2 fürstderr
. Darüber hinaus scheinen in einigen Shells standardmäßig andere Dateideskriptoren geöffnet zu sein. Inbash
haben Sie beispielsweise 255 (auch für Terminal-E / A) und indash
I 10, was/dev/tty
eher auf das spezifischetty
/pts
Gerät zeigt, das das Terminal verwendet. So schließen Sie alles außer 0, 1, 2 und 255 inbash
:Beachten Sie auch, dass dies
eval
erforderlich ist, wenn Sie den in einer Variablen enthaltenen Dateideskriptor umleiten. Wenn dies nichtbash
der Fall ist, wird die Variable erweitert, aber als Teil des Befehls betrachtet (in diesem Fall wird versucht,exec
den Befehl0
oder den1
zu schließenden Dateideskriptor zu verwenden).HINWEIS: Auch die Verwendung eines Globs anstelle von
ls
(z. B./proc/$$/fd/*
) scheint einen zusätzlichen Dateideskriptor für den Glob zu öffnen, daherls
scheint dies hier die beste Lösung zu sein.Aktualisieren
Weitere Informationen zur Portabilität von
/proc/$$/fd
finden Sie unter Portabilität von Dateideskriptor-Links . Wenn dies/proc/$$/fd
nicht verfügbar ist, wird ein Ersatz für die$(ls /proc/$$/fd)
Verwendung vonlsof
(falls verfügbar) verwendet$(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)
.quelle
/proc
ist nur unter Linux verfügbar./proc/PID/fd
das nicht sehr portabel ist. Zu sagen, dass dies/proc
nur unter Linux verfügbar ist, ist jedoch keine korrekte Aussage.<&-
Formular. Ist es anders / erforderlich?In der letzten Versionen von Bash (4.1 und weiter, Jahr 2009 und später) Sie können den Dateideskriptor angeben zu schließen , um einen Shell - Variable mit:
Das Feature war bereits in Korn Shell (seit 1993?), Hat aber anscheinend einige Zeit gebraucht, um in Bash einzudringen.
quelle
Löschen Sie alle Dateideskriptoren mit Ausnahme von i / o / e der aktuellen Shell, schließen Sie jedoch auch die als Argumente angegebenen aus
quelle
Ein anderer Weg ohne "Auswertung" ist die Verwendung des Formulars:
quelle
Nein. Der Kernel kann jeweils nur einen FD schließen, und bash verfügt nicht über "Gruppenbefehle" für FDs.
Entfernen Sie das
echo
und das"
nach dem Testen.Wenn dies nicht für die Shell selbst ist, sondern für die Ausführung eines Befehls, können Sie verwenden
nohup
.quelle
>&-
kann kein Parameter sein. Die Umleitung wird vor der Parametererweiterung analysiert.exec {fd}>&-
funktioniert heutzutage .