Apakah ada cara untuk menutup semua deskriptor file terbuka, tanpa memiliki daftar eksplisit sebelumnya?
bash
shell
file-descriptors
Lorenzo Pistone
sumber
sumber
Jawaban:
Untuk menjawab secara harfiah, untuk menutup semua deskriptor file terbuka untuk
bash
:Namun ini sebenarnya bukan ide yang baik karena akan menutup deskriptor file dasar yang dibutuhkan oleh input dan output. Jika Anda melakukan ini, tidak ada program yang Anda jalankan akan menampilkan hasilnya di terminal (kecuali jika mereka langsung menulis ke
tty
perangkat). Jika kenyataannya dalam tes saya menutupstdin
(exec 0>&-
) hanya menyebabkan shell interaktif untuk keluar.Apa yang sebenarnya ingin Anda lakukan adalah menutup semua deskriptor file yang bukan bagian dari operasi dasar shell. Ini adalah 0 untuk
stdin
, 1 untukstdout
dan 2 untukstderr
. Selain itu, beberapa shell juga tampaknya memiliki deskriptor file lain yang terbuka secara default. Dibash
, misalnya, Anda memiliki 255 (juga untuk terminal I / O) dan didash
I memiliki 10, yang mengarah ke/dev/tty
daripada spesifiktty
/pts
perangkat yang digunakan terminal. Untuk menutup semuanya kecuali 0, 1, 2 dan 255 dibash
:Perhatikan juga bahwa
eval
diperlukan ketika mengarahkan kembali deskriptor file yang terdapat dalam variabel, jika tidakbash
akan memperluas variabel tetapi anggap itu bagian dari perintah (dalam hal ini akan mencobaexec
perintah0
atau1
atau deskriptor file mana pun yang Anda coba tutup).CATATAN: Juga menggunakan glob bukannya
ls
(misalnya/proc/$$/fd/*
) tampaknya membuka deskriptor file tambahan untuk glob, jadils
sepertinya solusi terbaik di sini.Memperbarui
Untuk informasi lebih lanjut tentang portabilitas
/proc/$$/fd
, silakan lihat Portabilitas tautan deskriptor file . Jika/proc/$$/fd
tidak tersedia, maka penggantian untuk$(ls /proc/$$/fd)
, menggunakanlsof
(jika tersedia) akan menjadi$(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)
.sumber
/proc
hanya tersedia di Linux./proc/PID/fd
tidak terlalu portabel. Tetapi mengatakan bahwa/proc
hanya tersedia di Linux bukanlah pernyataan yang benar.<&-
formulir, apakah ada bedanya / diperlukan?Dalam versi terbaru dari Bash (4.1 dan seterusnya, tahun 2009 dan yang lebih baru), Anda dapat menentukan deskriptor file untuk ditutup menggunakan variabel shell:
Fitur itu sudah ada di shell Korn (sejak 1993?) Tetapi tampaknya butuh waktu untuk masuk ke Bash.
sumber
Hapus semua deskriptor file kecuali i / o / e dari shell saat ini, tetapi juga mengecualikan yang disediakan sebagai argumen
sumber
Cara lain tanpa "eval" sama sekali, adalah dengan menggunakan formulir:
sumber
Tidak. Kernel hanya dapat menutup satu FD pada satu waktu, dan bash tidak memiliki "perintah grup" untuk FD.
Hapus
echo
dan"
setelah pengujian.Jika ini bukan untuk shell itu sendiri tetapi untuk menjalankan perintah maka Anda dapat menggunakan
nohup
.sumber
>&-
tidak bisa menjadi parameter; pengalihan diuraikan sebelum ekspansi parameter.exec {fd}>&-
berfungsi.