Это не ошибка в bash
, а его задокументированное поведение :
Каждая команда в конвейере выполняется в своей собственной подоболочке
Инструкция return
действительна, находясь внутри определения функции, но также будучи в подоболочке, она не влияет на ее родительскую оболочку, поэтому следующая инструкция, выводит эхо
, выполняется независимо.
Тем не менее, это непереносимая конструкция оболочки, поскольку стандарт POSIX позволяет командам, составляющим конвейер, выполняться либо в подоболочке (по умолчанию), либо в верхний (допустимое расширение).
Кроме того, каждая команда многокомандного конвейера находится в среде подоболочки; однако в качестве расширения любая или все команды конвейера могут выполняться в текущей среде. Все остальные команды должны выполняться в текущей среде оболочки.
Надеюсь, вы можете указать bash
вести себя так, как вы ожидаете, с помощью пары параметров:
$ set +m # disable job control
$ shopt -s lastpipe # do not run the last command of a pipeline a subshell
$ o(){ echo | while read -r; do return 0; done; echo $?;}
$ o
$ <- nothing is printed here
apt
пока не может ()предоставить нужную вам информацию. aptitude
может, хотя и несколько запутанно:
aptitude search '~U ~ODebian' -F "%p %O"|awk '/Debian-Security/ {print $1}'
Это ищет все обновляемые(~U
)пакеты в официальных репозиториях Debian(~ODebian
)и отображает их имя пакета(%p
)и «происхождение»(%O
). Последний фактически отображает метку репозитория , что означает «Debian -Security :9/stable» для репозиториев безопасности Debian 9. В итоге вы получите список обновляемых имен пакетов из репозиториев безопасности.
Существует множество способов установки только обновлений безопасности, однако ни один из них не является идеальным.
aptitude
позволяет применять только обновления безопасности, просто прокрутив до заголовка «Обновления безопасности» (, который должен быть первым ), и нажав + .
Вы можете отправить список извлеченных выше пакетов на apt
для установки обновлений:
aptitude search '~U ~ODebian' -F "%p %O" |
awk '/Debian-Security/ {print $1}' |
xargs apt-get install --only-upgrade
Это имеет неприятный побочный -эффект очистки маркера «автоматически установлено» на обновленных пакетах.
Вы можете использовать unattended-upgrades
, действие которого по умолчанию — применять только обновления безопасности:
unattended-upgrades -v
Если вы не хотите, чтобы обновления устанавливались автоматически, вам необходимо отключить ежедневное задание cron unattended-upgrades
.
Чтобы отобразить обновление безопасности, вы можете использовать:
apt-get --just-print upgrade | grep -i security | awk '{print $2}' | awk '!seen[$0]++'
Применить только обновления безопасности для 1 пакета:
apt-get install --only-upgrade pckg_name
Чтобы применить только обновления безопасности из списка:
list=$(apt-get --just-print upgrade | grep -i security | awk '{print $2}' | awk '!seen[$0]++')
apt-get install --only-upgrade $list