В ответе Василия Старынкевича на этот вопрос 29 ноября 2011 г. он пишет:
Если это в Linux, вы всегда можете прочитать каталог / proc / self / fd /, чтобы найти используемые дескрипторы файлов.
Проведя несколько экспериментов, основанных на чтении каталога fd, я пришел к следующему коду, как «наиболее близкое соответствие» к тому, что я искал. На самом деле я искал однострочник bash, например
my_file_descriptor=$(open_r /path/to/a/file)
, который найдет самый низкий, неиспользуемый дескриптор файла И , откройте файл на нем И назначьте его переменной. Как видно из приведенного ниже кода, введя функцию «lower_unused_fd», я по крайней мере получаю «двухслойный» (FD = $ (lower_unused_fd) , за которым следует eval «exec $ FD <$ FILENAME») для задачи. Я НЕ был в состоянии написать функцию, которая работает как (воображаемый) "open_r" выше. Если кто-то знает, как это сделать, сделайте шаг вперед! Вместо этого мне пришлось разбить задачу на два шага: один шаг, чтобы <em>найти неиспользуемый дескриптор файла, и один шаг, чтобы открыть файл на нем. Также обратите внимание, что, чтобы иметь возможность поместить шаг find в функцию ("lower_unused_fd") и назначить его стандартный вывод для FD, мне пришлось использовать "/ proc / $$ / fd" вместо " / proc / self / fd "(как в предложении Бэзил Старынкевич), поскольку bash порождает подоболочку для выполнения функции.
#!/bin/bash
lowest_unused_fd () {
local FD=0
while [ -e /proc/$$/fd/$FD ]; do
FD=$((FD+1))
done
echo $FD
}
FILENAME="/path/to/file"
# Find the lowest, unused file descriptor
#+ and assign it to FD.
FD=$(lowest_unused_fd)
# Open the file on file descriptor FD.
if ! eval "exec $FD<$FILENAME"; then
exit 1
fi
# Read all lines from FD.
while read -u $FD a_line; do
echo "Read \"$a_line\"."
done
# Close FD.
eval "exec $FD<&-"