Czy istnieje sposób na zamknięcie wszystkich otwartych deskryptorów plików bez uprzedniej ich jawnej listy?
bash
shell
file-descriptors
Lorenzo Pistone
źródło
źródło
Odpowiedzi:
Aby odpowiedzieć dosłownie, zamknąć wszystkie otwarte deskryptory plików dla
bash
:Jednak to naprawdę nie jest dobry pomysł, ponieważ spowoduje zamknięcie podstawowych deskryptorów plików wymaganych przez powłokę dla danych wejściowych i wyjściowych. Jeśli to zrobisz, żaden z uruchomionych programów nie będzie wyświetlał danych wyjściowych na terminalu (chyba że zapisują
tty
bezpośrednio w urządzeniu). Jeśli fakt w moich testach zamknięciestdin
(exec 0>&-
) powoduje jedynie zamknięcie interaktywnej powłoki.To, czego właściwie możesz chcieć, to raczej zamknąć wszystkie deskryptory plików, które nie są częścią podstawowej operacji powłoki. Są to 0 dla
stdin
, 1 dlastdout
i 2 dlastderr
. Ponadto niektóre powłoki wydają się mieć domyślnie otwarte inne deskryptory plików. Wbash
, na przykład, mieć 255 (również dla zacisku wejścia / wyjścia) orazdash
, że nie więcej niż 10, co wskazuje/dev/tty
, a nie konkretnychtty
/pts
urządzenia terminala jest używany. Aby zamknąć wszystko oprócz 0, 1, 2 i 255 wbash
:Należy również zauważyć, że
eval
jest wymagana, gdy przekierowanie deskryptor pliku zawartego w zmiennej, jeśli niebash
wzrośnie zmienną, ale uważają, że część komendy (w tym przypadku byłoby spróbowaćexec
polecenia0
lub1
lub inny plik deskryptora staramy się blisko).UWAGA: Również użycie glob zamiast
ls
(np./proc/$$/fd/*
) Wydaje się otwierać dodatkowy deskryptor pliku dla glob, więcls
wydaje się tutaj najlepszym rozwiązaniem.Aktualizacja
Aby uzyskać więcej informacji na temat przenośności
/proc/$$/fd
, zobacz Przenośność linków deskryptorów plików . Jeśli/proc/$$/fd
jest niedostępne, oznacza to spadek w zamian za$(ls /proc/$$/fd)
użycielsof
(jeśli jest dostępne)$(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)
.źródło
/proc
jest dostępny tylko w systemie Linux./proc/PID/fd
to nie jest bardzo przenośne. Ale powiedzenie, że/proc
jest dostępne tylko pod Linuksem, nie jest poprawnym stwierdzeniem.<&-
formularza, czy jest on inny / potrzebny?W ostatnich wersjach bash (4.1 i nowsze, rok 2009 i później), które można określić deskryptor pliku do zamknięcia za pomocą zmiennej powłoki:
Ta funkcja była już w skorupie Korna (od 1993 roku?), Ale najwyraźniej zajęła trochę czasu, aby dostać się do Bash.
źródło
Wyczyść wszystkie deskryptory plików oprócz I / O / e bieżącej powłoki, ale również wyklucza te podane jako argumenty
źródło
Innym sposobem bez „ewaluacji” jest użycie formularza:
źródło
Nie. Jądro może zamykać tylko jedną FD na raz, a bash nie ma „komend grupowych” dla FD.
Usuń
echo
i"
po testach.Jeśli nie dotyczy to samej powłoki, ale polecenia, które należy uruchomić, możesz użyć
nohup
.źródło
>&-
nie może być parametrem; przekierowanie jest analizowane przed rozszerzeniem parametru.exec {fd}>&-
działa.