Чтение из файла в bash без использования стандартного l oop - нестандартный вариант использования - PullRequest
0 голосов
/ 02 мая 2020

Я знаком со следующим кодом для чтения каждой строки файла и выполнения некоторой команды.

while read -r line; do
  echo "$line"
done < filename

Вышеуказанный l oop определяется каждой строкой в ​​файле с блоком операций выполняется в l oop.

У меня есть скрипт с вложенными циклами, которые порождают и управляют потоками. Я хочу иметь возможность извлекать строку из файла по команде с помощью команды l oop вместо того, чтобы иметь рамку строки l oop. Например, на других языках будет fopen(), затем fread() и fclose() в конце программы для очистки. Есть ли эквивалент в bash?

Я использую Ubuntu 18.04 LTS и bash 4.4.20

1 Ответ

1 голос
/ 02 мая 2020

В bash вы можете открыть файл с помощью команды 'exe c'. Предполагая, что нет других входных файлов, вы можете перенаправить стандартный ввод. Если stdin используется для чего-то другого, попробуйте открыть файл в другом файловом дескрипторе (3, 4, ...). Вы не можете использовать 0, 1 и 2, и они уже связаны с stdin / stdout / stderr.

Использование stdin:

exec < filename

read ...
if [ ... ] ; then
    read ...
fi

# Close
exec <&-

Использование другого дескриптора файла

exec 3<filename

read -u3 ...
if [ ... ] ; then
    read -u3 ...
fi
exec 3<&-

Обратите внимание, что в отличие от других сред, код должен выбирать отдельный дескриптор файла для использования, что может быть сложно, если есть много файлов, которые нужно открыть одновременно. Лучшее решение, основанное на комментарии @wjandrea

exec {myfile}<filename

read -u$myfile ...
if [ ... ] ; then
    read -u$myfile ...
fi
exec $myfile<&-
...