В чистом bash
, вы можете использовать следующий метод, чтобы увидеть, если данный дескриптор файла (3
в данном случае) имеется:
rco="$(true 2>/dev/null >&3; echo $?)"
rci="$(true 2>/dev/null <&3; echo $?)"
if [[ "${rco}${rci}" = "11" ]] ; then
echo "Cannot read or write fd 3, hence okay to use"
fi
Это в основном работает путем тестирования, можно ли читать или писать на заданный дескриптор файла. Предполагая, что вы не можете этого сделать, вероятно, это нормально использовать.
С точки зрения находящих первый свободный дескриптор, вы можете использовать что-то вроде:
exec 3>/dev/null # Testing, comment out to make
exec 4</dev/null # descriptor available.
found=none
for fd in {0..200}; do
rco="$(true 2>/dev/null >&${fd}; echo $?)"
rci="$(true 2>/dev/null <&${fd}; echo $?)"
[[ "${rco}${rci}" = "11" ]] && found=${fd} && break
done
echo "First free is ${found}"
Запуск этого сценария дает 5
как первый свободный дескриптор, но вы можете играть вокруг с exec
линий, чтобы увидеть, как делая ранее доступный, он позволит фрагменту кода найти его.
Как было отмечено в комментариях, системы, которые обеспечивают procfs
(в /proc
файловой системы) имеет другой способ, в котором они могут обнаружить свободные дескрипторы. Каталог /proc/PID/fd
будет содержать запись для каждого дескриптора файла следующим образом:
pax> ls -1 /proc/$$/fd
0
1
2
255
Таким образом, вы можете использовать сценарий, аналогичный приведенному выше, чтобы найти свободный вход в там:
exec 3>/dev/null # Testing, comment out to make
exec 4</dev/null # descriptor available.
found=none
for fd in {0..200} ; do
[[ ! -e /proc/$$/fd/${fd} ]] && found=${fd} && break
done
echo "First free is ${found}"
Просто продолжайте что не все системы, предоставляющие bash
, обязательно будут иметь procfs
(примеры BDS и CygWin являются примерами). Должно быть хорошо для Linux, если это таргетинг на ОС.
Конечно, вы все еще имеют вариант упаковки весь скрипт, как что-то вроде:
(
# Your current script goes here
)
В этом случае, файл ручки будут сохранены вне этих скобок и вам может манипулировать ими, как вам кажется.
Я не вижу опции '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' дескриптор '' ''. Самый близкий подход - '-t number', который проверяет, открыт ли дескриптор файла _and_, подключенный к терминалу. Это ад, чтобы заставить скрипт интерпретировать цифры; вы не можете использовать '> & $ number', поэтому вам нужно будет возиться с суб-оболочками или чем-то еще. Нетрудно написать программу, которая проверяет данный дескриптор файла, но генерировать сценарий оболочки для использования произвольного числа может быть сложным. Поэтому большинство людей не беспокоится. –