Дескриптор файла Bash и запись printf в файл в цикле while - PullRequest
0 голосов
/ 11 ноября 2018

Я изучаю программирование на bash через книгу, и теперь я изучаю открытие файлов и файловых дескрипторов, но я не могу заставить этот код работать (см. Ниже), я хочу использовать файловый дескриптор 4 для записать вывод нижнего цикла while в файл somefile24.log, но somefile24.log будет пустым после запуска кода.

Вот код:

#!/bin/bash
#
# openFile.sh: print the contents of orders.txt

shopt -s -o nounset

declare LINE

exec 3< orders.txt
while read LINE <&3
do
    printf "%s\n" "$LINE"
done


echo
echo "Here is the new part of the program!"


exec 4> somefile24.log
count=1
while read LINE <&3
do
    printf "%s-----count=%d\n" "$LINE" "$count" >&4
    let count++
done
exit 0

Вот вывод:

(something78@notemDEB78)-(01:45:03)-(~/Bash_Programming_2018)
$./openFile.sh 
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something
something and something and something

Here is the new part of the program!

Ожидаемый результат:

Сценарий записывает содержимое orders.txt в somefile24.log


Я пытался проверить код в shellcheck , но он не видит проблему и только дает мне это:

$ shellcheck myscript

Line 10:
while read LINE <&3
      ^-- SC2162: read without -r will mangle backslashes.

Line 22:
while read LINE <&3
      ^-- SC2162: read without -r will mangle backslashes.

Line 25:
    let count++
    ^-- SC2219: Instead of 'let expr', prefer (( expr )) .

Я пытался сделать тест в командной строке:

(something78@notemDEB78)-(01:59:41)-(~/Bash_Programming_2018)
$exec 3>somefile24.log 
(something78@notemDEB78)-(01:59:59)-(~/Bash_Programming_2018)
$echo testing >&3
(something78@notemDEB78)-(02:00:03)-(~/Bash_Programming_2018)
$cat somefile24.log 
testing

Я знаю, что я могу просто сделать:

while
printf "%s\n" "$LINE" >> somefile24.log

ВОПРОС:

Можно ли использовать файловый дескриптор для записи в файл, подобный этому, в цикле, и если да, то как и что я делаю неправильно?

А почему somefile24.log всегда пусто после запуска скрипта?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

После первого цикла дескриптор файла находится в EOF. Поэтому вам нужно сбросить дескриптор файла перед тем, как перейти ко второму циклу.

0 голосов
/ 11 ноября 2018

Вы уже прочитали содержимое файла в первом цикле. Следовательно, файловый дескриптор 3 уже находится в EOF. Вы можете сбросить дескриптор файла 3, прежде чем читать его снова. Например. перед вторым циклом, запустите это снова exec 3< orders.txt

...