Вы можете найти все установленные вручную пакеты без их 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)
Чтобы распечатать файл, первый 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
с.