FYI,
> bash -x linux-purge --auto-only --keep=2 --yes + set -u -e + export LC_ALL=C + LC_ALL=C + export TMPDIR=/dev/shm + TMPDIR=/dev/shm + readonly program_name=linux-purge 'program_full_name=Linux Purge for Ubuntu' program_version=1.0.110-d5962da copyright_years=2017-2020 MB=1000000 width=72 + program_name=linux-purge + program_full_name='Linux Purge for Ubuntu' + program_version=1.0.110-d5962da + copyright_years=2017-2020 + MB=1000000 + width=72 ++ uname -r ++ stat --format=%m /boot + readonly 'w_error=Terminal screen not wide enough. Minimum is 72 columns.' 'h_error=Not enough lines in terminal screen.' lockfile=/var/lib/dpkg/lock current=4.15.0-115-generic boot=/boot + w_error='Terminal screen not wide enough. Minimum is 72 columns.' + h_error='Not enough lines in terminal screen.' + lockfile=/var/lib/dpkg/lock + current=4.15.0-115-generic + boot=/boot + readonly 'cs=;' + cs=';' ++ mktemp /dev/shm/linux-purge.error_XXX + readonly error_file=/dev/shm/linux-purge.error_ZxP + error_file=/dev/shm/linux-purge.error_ZxP + keep= + auto_only= + clear_boot= + choose= + debug= + debug_file= + show_debug_filename= + fix= + info= + simulate= + yes= + manual= + legend=1 + list= + optimize= + interface=d + operation=purge + update_grub_disabled= + update_grub= + unset -v LatestReleases ManualReleases HoldReleases + trap finish EXIT + trap 'finish INT; trap - INT; kill -s INT -- $$' INT + env -u GETOPT_COMPATIBLE getopt --test + [[ 4 -eq 4 ]] ++ env -u GETOPT_COMPATIBLE getopt -o abcd::fhi:k:lmnosrvy -l auto-only,clear-boot,choose,debug::,fix,help,info,interface:,keep:,list,manual,no-legend,optimize,remove,simulate,version,yes --name '[linux-purge] ERROR' -- --auto-only --keep=2 --yes + params=' --auto-only --keep '\''2'\'' --yes --' + eval set -- ' --auto-only --keep '\''2'\'' --yes --' ++ set -- --auto-only --keep 2 --yes -- + : + case ${1-} in + auto_only=1 + shift + : + case ${1-} in + keep=1 + n=2 + shift + shift + : + case ${1-} in + yes=-y + shift + : + case ${1-} in + shift + break + [[ 0 -eq 0 ]] + [[ -n '' ]] + [[ -n '' ]] + [[ -n 1 ]] + [[ 2 =~ ^[0-9]+$ ]] + [[ -n 1 ]] + [[ ! -n 1 ]] + [[ -n 1 ]] + [[ -n '' ]] + [[ -n '' ]] + [[ -n '' ]] + [[ -z '' ]] + [[ 0 -ne 0 ]] + [[ -n '' ]] ++ command -v update-grub + update_grub=/usr/sbin/update-grub + [[ -n /usr/sbin/update-grub ]] + chmod +x /usr/sbin/update-grub + [[ d = d ]] + hash dialog + [[ -n '' ]] + operate + [[ -n '' ]] + purge_normally ++ dpkg-query -W '-f=${Package} ${db:Status-Abbrev}\n' +++ literalize 4.15.0-115-generic +++ printf %s 4.15.0-115-generic +++ sed -e 's/[^^]/[&]/g' -e 's/\^/\\^/g' ++ grep -qE '^linux-image-(unsigned-)?[4][.][1][5][.][0][-][1][1][5][-][g][e][n][e][r][i][c] [ih]i $' dpkg-query: error: error writing to '<standard output>': Broken pipe ++ dpkg-query -W '-f=${Package} ${Status}\n' 'linux-*' ++ awk '$3!="ok" || ($4!="installed" && $4!="not-installed" && $4!="config-files") ' + Pkgs= + [[ -n '' ]] ++ dpkg-query -W '-f=${db:Status-Abbrev} ${Package}\n' ++ sed -nr 's/^[ih]i linux-image-(unsigned-)?([0-9]+\..+)/\2/p' ++ linux-version sort + Releases='4.15.0-55-generic 4.15.0-106-generic 4.15.0-107-generic 4.15.0-112-generic 4.15.0-115-generic' + [[ -n '' ]] + [[ -z 1 ]] + ReleasesToKeep= ++ get_latest_releases +++ get_meta_kernels +++ dpkg-query -W -f '${db:Status-Abbrev} ${Package}\n' +++ awk '/^[ih].. linux-(.+-)?image-/{print $2}' +++ grep -Ev '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' ++ local meta_kernels= ++ [[ -z '' ]] + LatestReleases= + [[ -n '' ]] + error 'There are no meta-kernels so can not decide which kernels to keep.' + printf '[%s] ERROR: %s\n' linux-purge 'There are no meta-kernels so can not decide which kernels to keep.' + fold -s [linux-purge] ERROR: There are no meta-kernels so can not decide which kernels to keep. + [[ -n '' ]] + echo 1 + exit 1 + finish + err=1 + trap - EXIT + [[ -n 1 ]] + err=0 + rm -- /dev/shm/linux-purge.error_ZxP + restore_update_grub + [[ -n '' ]] + [[ -n '' ]] + [[ null == INT ]] + (( err != 0 && err != 141 )) + return 0
FYI,
> bash -x linux-purge --auto-only --keep=2 --yes name=linux- purge 'program_ full_name= Linux Purge for Ubuntu' program_ version= 1.0.110- d5962da copyright_ years=2017- 2020 MB=1000000 width=72 name=linux- purge full_name= 'Linux Purge for Ubuntu' version= 1.0.110- d5962da years=2017- 2020 /var/lib/ dpkg/lock current= 4.15.0- 115-generic boot=/boot /var/lib/ dpkg/lock 4.15.0- 115-generic linux-purge. error_XXX /dev/shm/ linux-purge. error_ZxP /dev/shm/ linux-purge. error_ZxP filename= grub_disabled= k:lmnosrvy -l auto-only, clear-boot, choose, debug:: ,fix,help, info,interface: ,keep:, list,manual, no-legend, optimize, remove, simulate, version, yes --name '[linux-purge] ERROR' -- --auto-only --keep=2 --yes grub=/usr/ sbin/update- grub update- grub ]] update- grub Abbrev} \n' image-( unsigned- )?[4][. ][1][5] [.][0][ -][1][1] [5][-][ g][e][n] [e][r][ i][c] [ih]i $' Status- Abbrev} ${Package}\n' (unsigned- )?([0-9] +\..+)/ \2/p' '4.15.0- 55-generic Abbrev} ${Package}\n' .+-)?image- /{print $2}' ]]+\.[[ :digit: ]]+\.[[ :digit: ]]+' linux-purge. error_ZxP
+ set -u -e
+ export LC_ALL=C
+ LC_ALL=C
+ export TMPDIR=/dev/shm
+ TMPDIR=/dev/shm
+ readonly program_
+ program_
+ program_
+ program_
+ copyright_
+ MB=1000000
+ width=72
++ uname -r
++ stat --format=%m /boot
+ readonly 'w_error=Terminal screen not wide enough. Minimum is 72 columns.' 'h_error=Not enough lines in terminal screen.' lockfile=
+ w_error='Terminal screen not wide enough. Minimum is 72 columns.'
+ h_error='Not enough lines in terminal screen.'
+ lockfile=
+ current=
+ boot=/boot
+ readonly 'cs=;'
+ cs=';'
++ mktemp /dev/shm/
+ readonly error_file=
+ error_file=
+ keep=
+ auto_only=
+ clear_boot=
+ choose=
+ debug=
+ debug_file=
+ show_debug_
+ fix=
+ info=
+ simulate=
+ yes=
+ manual=
+ legend=1
+ list=
+ optimize=
+ interface=d
+ operation=purge
+ update_
+ update_grub=
+ unset -v LatestReleases ManualReleases HoldReleases
+ trap finish EXIT
+ trap 'finish INT; trap - INT; kill -s INT -- $$' INT
+ env -u GETOPT_COMPATIBLE getopt --test
+ [[ 4 -eq 4 ]]
++ env -u GETOPT_COMPATIBLE getopt -o abcd::fhi:
+ params=' --auto-only --keep '\''2'\'' --yes --'
+ eval set -- ' --auto-only --keep '\''2'\'' --yes --'
++ set -- --auto-only --keep 2 --yes --
+ :
+ case ${1-} in
+ auto_only=1
+ shift
+ :
+ case ${1-} in
+ keep=1
+ n=2
+ shift
+ shift
+ :
+ case ${1-} in
+ yes=-y
+ shift
+ :
+ case ${1-} in
+ shift
+ break
+ [[ 0 -eq 0 ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ -n 1 ]]
+ [[ 2 =~ ^[0-9]+$ ]]
+ [[ -n 1 ]]
+ [[ ! -n 1 ]]
+ [[ -n 1 ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ -z '' ]]
+ [[ 0 -ne 0 ]]
+ [[ -n '' ]]
++ command -v update-grub
+ update_
+ [[ -n /usr/sbin/
+ chmod +x /usr/sbin/
+ [[ d = d ]]
+ hash dialog
+ [[ -n '' ]]
+ operate
+ [[ -n '' ]]
+ purge_normally
++ dpkg-query -W '-f=${Package} ${db:Status-
+++ literalize 4.15.0-115-generic
+++ printf %s 4.15.0-115-generic
+++ sed -e 's/[^^]/[&]/g' -e 's/\^/\\^/g'
++ grep -qE '^linux-
dpkg-query: error: error writing to '<standard output>': Broken pipe
++ dpkg-query -W '-f=${Package} ${Status}\n' 'linux-*'
++ awk '$3!="ok" || ($4!="installed" && $4!="not-installed" && $4!="config-files")
'
+ Pkgs=
+ [[ -n '' ]]
++ dpkg-query -W '-f=${db:
++ sed -nr 's/^[ih]i linux-image-
++ linux-version sort
+ Releases=
4.15.0-106-generic
4.15.0-107-generic
4.15.0-112-generic
4.15.0-115-generic'
+ [[ -n '' ]]
+ [[ -z 1 ]]
+ ReleasesToKeep=
++ get_latest_releases
+++ get_meta_kernels
+++ dpkg-query -W -f '${db:Status-
+++ awk '/^[ih].. linux-(
+++ grep -Ev '[[:digit:
++ local meta_kernels=
++ [[ -z '' ]]
+ LatestReleases=
+ [[ -n '' ]]
+ error 'There are no meta-kernels so can not decide which kernels to keep.'
+ printf '[%s] ERROR: %s\n' linux-purge 'There are no meta-kernels so can not decide which kernels to keep.'
+ fold -s
[linux-purge] ERROR: There are no meta-kernels so can not decide which kernels
to keep.
+ [[ -n '' ]]
+ echo 1
+ exit 1
+ finish
+ err=1
+ trap - EXIT
+ [[ -n 1 ]]
+ err=0
+ rm -- /dev/shm/
+ restore_update_grub
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ null == INT ]]
+ (( err != 0 && err != 141 ))
+ return 0