bash, проходящий через 2 файла одновременно построчно - PullRequest
0 голосов
/ 08 ноября 2018

Я должен отметить, что я новичок в bash, поэтому его синтаксис для меня сейчас огромная проблема

Что у меня есть?

2 файла. Например,

tmpp1.txt

drwxrw-rw-
drwxrw-rw-
-rw-r--r--

tmpp2.txt

drw-rw-rw-
drwxrw-rw-
-rw-r--r--

Что я хочу?

Чтобы просмотреть эти 2 файла одновременно, чтобы я мог сравнивать их построчно. Например: проверить, совпадает ли строка в строке 1 файла tmpp1.txt со строкой в ​​строке 1 файла tmpp2.txt, а затем для lin2, line3 и т. д.

Если строки разные, мне нужно указать, что изменилось.

Прочитав несколько других постов об этом в интернете и переполнив сам стек, я получил это

while read p1 <&tmpp1.txt && read p2 <&tmpp2.txt; do
    if [ "$p1" != "$p2" ]
    then
      echo "A file has had the wrong permission: $p1"
      echo "This has been changed to: $p2"
    fi
done 

Этот код выдает ошибку: ./folder-stats-2.sh: line 51: tmpp1.txt: ambiguous redirect Точнее, в то время как состояние

Но мое здравомыслие ушло .. У меня кончились идеи. Я был бы очень признателен за помощь Большое спасибо:)

1 Ответ

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

Ошибка вызвана использованием неопределенного оператора <& вместо <. (<& само по себе не определено, то есть; вам нужно указать дескриптор файла, например <&3, чтобы он был действительным). Однако это не даст желаемого результата, поскольку входные файлы будут открываться заново каждый раз В результате вы неоднократно читаете первую строку каждого файла.

Вместо этого вам нужно использовать два отдельных файловых дескриптора, открывая их один раз для цикла, чтобы read наследовал один и тот же дескриптор каждый раз в цикле.

while read p1 && read p2 <&3  && read p3 <&4; do
   ...
done < tmpp1.txt 3< tmpp2.txt 4< tmpp3.txt

<&3 указывает read читать из файлового дескриптора 3 вместо файлового дескриптора 0 (стандартный ввод, по умолчанию).

Между прочим, стандартным вводом всегда является файловый дескриптор 0. Вы можете (без необходимости) писать read p1 <&0 и 0< tmpp1.txt. (1 и 2 - стандартный вывод и стандартная ошибка соответственно, поэтому вы начинаете с 3 для дополнительных файловых дескрипторов.)

...