Почему дескриптор файла открывается и читается только один раз?

Вы можете найти все установленные вручную пакеты без их 1-го уровня зависимостей следующим образом:

apt-mark showmanual | sort > manually-installed.txt

apt show $(apt-mark showmanual) 2>/dev/null | 
grep -e ^Depends -e ^Pre-Depends > deps1.txt

cat deps1.txt | 
sed 's/^Depends: //; s/^Pre-Depends: //; 
     s/(.*)//g; s/:any//g' > deps2.txt

cat deps2.txt | tr -d ',|' | tr ' ' '\n' | grep -v ^$ |
sort -u > all-dep-packages.txt

grep -v -F -f all-dep-packages.txt manually-installed.txt

Вы также можете использовать следующую -магию вкладыша:

apt-mark showmanual | sort | grep -v -F -f <(apt show $(apt-mark showmanual) 2> /dev/null | grep -e ^Depends -e ^Pre-Depends | sed 's/^Depends: //; s/^Pre-Depends: //; s/(.*)//g; s/:any//g' | tr -d ',|' | tr ' ' '\n' | grep -v ^$ | sort -u)
7
30.12.2020, 14:01
1 ответ

Чтобы распечатать файл, первый catдолжен прочитать его до конца. exec 6< input.txtзаставляет оболочку удерживать файловый дескриптор до тех пор, пока оболочка умирает или закрывает его, поэтому смещение файла по-прежнему указывает на конец файл, когда вызывается второй cat, который, таким образом, ничего не записывает в стандартный вывод.

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

echo "File contents" > input.txt
exec 6< input.txt
cat "/proc/$$/fdinfo/6"
cat <&6
cat "/proc/$$/fdinfo/6"
cat <&6

Если вы выполните этот скрипт, вы получите что-то вроде

pos:    0
flags:  0100000
mnt_id: 113
File contents
pos:    14
flags:  0100000
mnt_id: 113

подтверждение того, что смещение(pos)не равно 0 когда второй catвыполняется, но вместо этого указывает на его конец.

Чтобы сбросить смещение, вы можете добавить еще один exec 6< input.txtмежду catс.

13
18.03.2021, 22:40

Теги

Похожие вопросы