Есть ли способ закрыть все дескрипторы открытого файла, не имея заранее явного списка их?
bash
shell
file-descriptors
Лоренцо Пистоне
источник
источник
Ответы:
Чтобы ответить буквально, закройте все дескрипторы открытого файла для
bash
:Однако это действительно не очень хорошая идея, поскольку она закроет основные файловые дескрипторы, необходимые оболочке для ввода и вывода. Если вы сделаете это, ни у одной из запущенных вами программ не будет отображаться вывод на терминале (если только они не пишут на
tty
устройство напрямую). Если факт в моих тестах closestdin
(exec 0>&-
) просто вызывает выход из интерактивной оболочки.На самом деле вы можете просто попытаться закрыть все файловые дескрипторы, которые не являются частью основной операции оболочки. Это 0 для
stdin
, 1 дляstdout
и 2 дляstderr
. Кроме того, в некоторых оболочках, по-видимому, по умолчанию открыты и другие файловые дескрипторы. Вbash
, например, у Вас есть 255 (также для терминала ввода / вывода) иdash
у меня 10, что указывает на ,/dev/tty
а не конкретногоtty
/pts
устройства терминал использует. Чтобы закрыть все, кроме 0, 1, 2 и 255 вbash
:Следует также отметить , что
eval
требуется при перенаправлении дескриптора файла , содержащегося в переменной, если неbash
будет расширять переменную , но рассмотреть его часть команды (в этом случае она будет пытатьсяexec
команды0
или1
или в зависимости от того дескриптора файла , который вы пытаетесь закрыть).ПРИМЕЧАНИЕ. Кроме того, использование глобуса вместо
ls
(например/proc/$$/fd/*
), по-видимому, открывает дополнительный файловый дескриптор для глоба, поэтому здесьls
представляется наилучшим решением.Обновить
Дополнительную информацию о переносимости
/proc/$$/fd
см. В разделе Переносимость ссылок на дескрипторы файлов . Если/proc/$$/fd
недоступен, то будет замена для$(ls /proc/$$/fd)
использования,lsof
(если это доступно) будет$(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)
.источник
/proc
доступно только под Linux./proc/PID/fd
это не очень удобно. Но говорить, что/proc
доступно только под Linux, не является правильным утверждением.<&-
форму, она отличается от других / нужна?В последних версиях Bash (4.1 и более поздних, 2009 и более поздних) вы можете указать дескриптор файла, который нужно закрыть, используя переменную оболочки:
Эта функция уже была в оболочке Korn (с 1993 года?), Но, видимо, потребовалось некоторое время, чтобы проникнуть в Bash.
источник
Очистить все файловые дескрипторы, кроме ввода / вывода текущей оболочки, но также исключить те, которые представлены в качестве аргументов
источник
Еще один способ вообще не использовать eval - использовать форму:
источник
Нет. Ядро может закрывать только один FD за раз, и bash не имеет «групповых команд» для FD.
Удалить
echo
и"
после тестирования.Если это не для самой оболочки, а для запуска команды, вы можете использовать
nohup
.источник
>&-
не может быть параметром; перенаправление анализируется перед расширением параметра.exec {fd}>&-
работает.