I just tested in a freshly installed Bookworm VM and it works for me. I provide you with the listing ofI'm reasonably certain that under bullseye (v11), I could sudo ifdown <tabComplete> / sudo ifup <tabComplete>.
On bookworm (v12):
sudo ifdown <tabComplete> does not "work"
set -x
so that you can compare.Code:
user@debvirt12:~$ head -n1 /etc/apt/sources.list#deb cdrom:[Debian GNU/Linux 12.5.0 _Bookworm_ - Official amd64 NETINST with firmware 20240210-11:27]/ bookworm contrib main non-free-firmwareuser@debvirt12:~$ sudo ifdown <TabTab>enp1s0 lo user@debvirt12:~$ user@debvirt12:~$ set -xuser@debvirt12:~$ sudo ifdown + local cur prev words cword split+ _init_completion -s+ local exclude= flag outx errx inx OPTIND=1+ getopts n:e:o:i:s flag -s+ case $flag in+ split=false+ exclude+==+ getopts n:e:o:i:s flag -s+ COMPREPLY=()+ local 'redir=@(?([0-9])<|?([0-9&])>?(>)|>&)'+ _get_comp_words_by_ref -n '=<>&' cur prev words cword+ local exclude flag i OPTIND=1+ words=()+ local cur cword words+ upargs=()+ upvars=()+ local upargs upvars vcur vcword vprev vwords+ getopts c:i:n:p:w: flag -n '=<>&' cur prev words cword+ case $flag in+ exclude='=<>&'+ getopts c:i:n:p:w: flag -n '=<>&' cur prev words cword+ [[ 6 -ge 3 ]]+ case ${!OPTIND} in+ vcur=cur+ (( OPTIND += 1 ))+ [[ 6 -ge 4 ]]+ case ${!OPTIND} in+ vprev=prev+ (( OPTIND += 1 ))+ [[ 6 -ge 5 ]]+ case ${!OPTIND} in+ vwords=words+ (( OPTIND += 1 ))+ [[ 6 -ge 6 ]]+ case ${!OPTIND} in+ vcword=cword+ (( OPTIND += 1 ))+ [[ 6 -ge 7 ]]+ __get_cword_at_cursor_by_ref '=<>&' words cword cur+ words=()+ local cword words+ __reassemble_comp_words_by_ref '=<>&' words cword+ local exclude i j line ref+ [[ -n =<>& ]]+ exclude='[=<>&]'+ printf -v cword %s 2+ [[ -v exclude ]]+ line='sudo ifdown '+ (( i = 0, j = 0 ))+ (( i < 3 ))+ [[ 0 -gt 0 ]]+ ref='words[0]'+ printf -v 'words[0]' %s sudo+ line=' ifdown '+ (( i == COMP_CWORD ))+ (( i++, j++ ))+ (( i < 3 ))+ [[ 1 -gt 0 ]]+ [[ ifdown == +([=<>&]) ]]+ ref='words[1]'+ printf -v 'words[1]' %s ifdown+ line=' '+ (( i == COMP_CWORD ))+ (( i++, j++ ))+ (( i < 3 ))+ [[ 2 -gt 0 ]]+ [[ '' == +([=<>&]) ]]+ ref='words[2]'+ printf -v 'words[2]' %s ''+ line=' '+ (( i == COMP_CWORD ))+ printf -v cword %s 2+ (( i++, j++ ))+ (( i < 3 ))+ (( i == COMP_CWORD ))+ local i cur= index=12 'lead=sudo ifdown '+ [[ 12 -gt 0 ]]+ [[ -n sudo ifdown ]]+ [[ -n sudoifdown ]]+ cur='sudo ifdown '+ (( i = 0 ))+ (( i <= cword ))+ [[ 12 -ge 4 ]]+ [[ sudo != \s\u\d\o ]]+ (( i < cword ))+ local old_size=12+ cur=' ifdown '+ local new_size=8+ (( index -= old_size - new_size ))+ (( ++i ))+ (( i <= cword ))+ [[ 8 -ge 6 ]]+ [[ ifdow != \i\f\d\o\w\n ]]+ cur='ifdown '+ (( index > 0 ))+ (( index-- ))+ [[ 7 -ge 6 ]]+ [[ ifdown != \i\f\d\o\w\n ]]+ (( i < cword ))+ local old_size=7+ cur=' '+ local new_size=1+ (( index -= old_size - new_size ))+ (( ++i ))+ (( i <= cword ))+ [[ 1 -ge 0 ]]+ [[ '' != '' ]]+ (( i < cword ))+ (( ++i ))+ (( i <= cword ))+ [[ -n ]]+ [[ ! -n '' ]]+ cur=+ (( index < 0 ))+ local words cword cur+ _upvars -a3 words sudo ifdown '' -v cword 2 -v cur ''+ (( 11 ))+ (( 11 ))+ case $1 in+ [[ -n 3 ]]+ printf %d 3+ [[ -n words ]]+ unset -v words+ eval 'words=("${@:3:3}")'++ words=("${@:3:3}")+ shift 5+ (( 6 ))+ case $1 in+ [[ -n cword ]]+ unset -v cword+ eval 'cword="$3"'++ cword=2+ shift 3+ (( 3 ))+ case $1 in+ [[ -n cur ]]+ unset -v cur+ eval 'cur="$3"'++ cur=+ shift 3+ (( 0 ))+ [[ -v vcur ]]+ upvars+=("$vcur")+ upargs+=(-v $vcur "$cur")+ [[ -v vcword ]]+ upvars+=("$vcword")+ upargs+=(-v $vcword "$cword")+ [[ -v vprev ]]+ [[ 2 -ge 1 ]]+ upvars+=("$vprev")+ upargs+=(-v $vprev "${words[cword - 1]}")+ [[ -v vwords ]]+ upvars+=("$vwords")+ upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})+ (( 4 ))+ local cur cword prev words+ _upvars -v cur '' -v cword 2 -v prev ifdown -a3 words sudo ifdown ''+ (( 14 ))+ (( 14 ))+ case $1 in+ [[ -n cur ]]+ unset -v cur+ eval 'cur="$3"'++ cur=+ shift 3+ (( 11 ))+ case $1 in+ [[ -n cword ]]+ unset -v cword+ eval 'cword="$3"'++ cword=2+ shift 3+ (( 8 ))+ case $1 in+ [[ -n prev ]]+ unset -v prev+ eval 'prev="$3"'++ prev=ifdown+ shift 3+ (( 5 ))+ case $1 in+ [[ -n 3 ]]+ printf %d 3+ [[ -n words ]]+ unset -v words+ eval 'words=("${@:3:3}")'++ words=("${@:3:3}")+ shift 5+ (( 0 ))+ _variables+ [[ '' =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]+ [[ '' =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]+ [[ '' =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*]$ ]]+ return 1+ [[ '' == @(?([0-9])<|?([0-9&])>?(>)|>&)* ]]+ [[ ifdown == @(?([0-9])<|?([0-9&])>?(>)|>&) ]]+ local i skip+ (( i = 1 ))+ (( i < 3 ))+ [[ ifdown == @(?([0-9])<|?([0-9&])>?(>)|>&)* ]]+ (( i++ ))+ (( 1 ))+ (( i < 3 ))+ [[ '' == @(?([0-9])<|?([0-9&])>?(>)|>&)* ]]+ (( i++ ))+ (( 1 ))+ (( i < 3 ))+ (( cword <= 0 ))+ prev=ifdown+ [[ -n false ]]+ _split_longopt+ [[ '' == --?*=* ]]+ return 1+ return 0+ local i mode=normal+ [[ sudo == *sudoedit ]]+ [[ normal == normal ]]+ (( i = 1 ))+ (( i <= cword ))+ [[ ifdown != -* ]]+ local PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin:/usr/local/sbin+ local root_command=ifdown+ _command_offset 1+ local word_offset=1 i j+ (( i = 0 ))+ (( i < word_offset ))+ (( j = 0 ))+ (( j <= 12 ))+ [[ sudo ifdown == \s\u\d\o* ]]+ break+ COMP_LINE=' ifdown '+ (( COMP_POINT -= 4 ))+ (( i++ ))+ (( i < word_offset ))+ (( i = 0 ))+ (( i <= COMP_CWORD - word_offset ))+ COMP_WORDS[i]=ifdown+ (( i++ ))+ (( i <= COMP_CWORD - word_offset ))+ COMP_WORDS[i]=+ (( i++ ))+ (( i <= COMP_CWORD - word_offset ))+ (( i ))+ (( i <= COMP_CWORD ))+ unset 'COMP_WORDS[i]'+ (( i++ ))+ (( i <= COMP_CWORD ))+ (( COMP_CWORD -= word_offset ))+ COMPREPLY=()+ local cur+ _get_comp_words_by_ref cur+ local exclude flag i OPTIND=1+ words=()+ local cur cword words+ upargs=()+ upvars=()+ local upargs upvars vcur vcword vprev vwords+ getopts c:i:n:p:w: flag cur+ [[ 1 -ge 1 ]]+ case ${!OPTIND} in+ vcur=cur+ (( OPTIND += 1 ))+ [[ 1 -ge 2 ]]+ __get_cword_at_cursor_by_ref '' words cword cur+ words=()+ local cword words+ __reassemble_comp_words_by_ref '' words cword+ local exclude i j line ref+ [[ -n '' ]]+ printf -v cword %s 1+ [[ -v exclude ]]+ for i in "${!COMP_WORDS[@]}"+ printf -v 'words[i]' %s ifdown+ for i in "${!COMP_WORDS[@]}"+ printf -v 'words[i]' %s ''+ local i cur= index=8 'lead= ifdown '+ [[ 8 -gt 0 ]]+ [[ -n ifdown ]]+ [[ -n ifdown ]]+ cur=' ifdown '+ (( i = 0 ))+ (( i <= cword ))+ [[ 8 -ge 6 ]]+ [[ ifdow != \i\f\d\o\w\n ]]+ cur='ifdown '+ (( index > 0 ))+ (( index-- ))+ [[ 7 -ge 6 ]]+ [[ ifdown != \i\f\d\o\w\n ]]+ (( i < cword ))+ local old_size=7+ cur=' '+ local new_size=1+ (( index -= old_size - new_size ))+ (( ++i ))+ (( i <= cword ))+ [[ 1 -ge 0 ]]+ [[ '' != '' ]]+ (( i < cword ))+ (( ++i ))+ (( i <= cword ))+ [[ -n ]]+ [[ ! -n '' ]]+ cur=+ (( index < 0 ))+ local words cword cur+ _upvars -a2 words ifdown '' -v cword 1 -v cur ''+ (( 10 ))+ (( 10 ))+ case $1 in+ [[ -n 2 ]]+ printf %d 2+ [[ -n words ]]+ unset -v words+ eval 'words=("${@:3:2}")'++ words=("${@:3:2}")+ shift 4+ (( 6 ))+ case $1 in+ [[ -n cword ]]+ unset -v cword+ eval 'cword="$3"'++ cword=1+ shift 3+ (( 3 ))+ case $1 in+ [[ -n cur ]]+ unset -v cur+ eval 'cur="$3"'++ cur=+ shift 3+ (( 0 ))+ [[ -v vcur ]]+ upvars+=("$vcur")+ upargs+=(-v $vcur "$cur")+ [[ -v vcword ]]+ [[ -v vprev ]]+ [[ -v vwords ]]+ (( 1 ))+ local cur+ _upvars -v cur ''+ (( 3 ))+ (( 3 ))+ case $1 in+ [[ -n cur ]]+ unset -v cur+ eval 'cur="$3"'++ cur=+ shift 3+ (( 0 ))+ (( COMP_CWORD == 0 ))+ local cmd=ifdown compcmd=ifdown++ complete -p ifdown+ local 'cspec=complete -F _ifupdown ifdown'+ [[ ! -n complete -F _ifupdown ifdown ]]+ [[ ! -n complete -F _ifupdown ifdown ]]+ [[ -n complete -F _ifupdown ifdown ]]+ [[ _ifupdown ifdown != \c\o\m\p\l\e\t\e\ \-\F\ \_\i\f\u\p\d\o\w\n\ \i\f\d\o\w\n ]]+ local 'func=_ifupdown ifdown'+ func=_ifupdown+ (( 2 >= 2 ))+ _ifupdown ifdown '' ifdown+ local cur prev words cword+ _init_completion+ local exclude= flag outx errx inx OPTIND=1+ getopts n:e:o:i:s flag+ COMPREPLY=()+ local 'redir=@(?([0-9])<|?([0-9&])>?(>)|>&)'+ _get_comp_words_by_ref -n '<>&' cur prev words cword+ local exclude flag i OPTIND=1+ words=()+ local cur cword words+ upargs=()+ upvars=()+ local upargs upvars vcur vcword vprev vwords+ getopts c:i:n:p:w: flag -n '<>&' cur prev words cword+ case $flag in+ exclude='<>&'+ getopts c:i:n:p:w: flag -n '<>&' cur prev words cword+ [[ 6 -ge 3 ]]+ case ${!OPTIND} in+ vcur=cur+ (( OPTIND += 1 ))+ [[ 6 -ge 4 ]]+ case ${!OPTIND} in+ vprev=prev+ (( OPTIND += 1 ))+ [[ 6 -ge 5 ]]+ case ${!OPTIND} in+ vwords=words+ (( OPTIND += 1 ))+ [[ 6 -ge 6 ]]+ case ${!OPTIND} in+ vcword=cword+ (( OPTIND += 1 ))+ [[ 6 -ge 7 ]]+ __get_cword_at_cursor_by_ref '<>&' words cword cur+ words=()+ local cword words+ __reassemble_comp_words_by_ref '<>&' words cword+ local exclude i j line ref+ [[ -n <>& ]]+ exclude='[<>&]'+ printf -v cword %s 1+ [[ -v exclude ]]+ line=' ifdown '+ (( i = 0, j = 0 ))+ (( i < 2 ))+ [[ 0 -gt 0 ]]+ ref='words[0]'+ printf -v 'words[0]' %s ifdown+ line=' '+ (( i == COMP_CWORD ))+ (( i++, j++ ))+ (( i < 2 ))+ [[ 1 -gt 0 ]]+ [[ '' == +([<>&]) ]]+ ref='words[1]'+ printf -v 'words[1]' %s ''+ line=' '+ (( i == COMP_CWORD ))+ printf -v cword %s 1+ (( i++, j++ ))+ (( i < 2 ))+ (( i == COMP_CWORD ))+ local i cur= index=8 'lead= ifdown '+ [[ 8 -gt 0 ]]+ [[ -n ifdown ]]+ [[ -n ifdown ]]+ cur=' ifdown '+ (( i = 0 ))+ (( i <= cword ))+ [[ 8 -ge 6 ]]+ [[ ifdow != \i\f\d\o\w\n ]]+ cur='ifdown '+ (( index > 0 ))+ (( index-- ))+ [[ 7 -ge 6 ]]+ [[ ifdown != \i\f\d\o\w\n ]]+ (( i < cword ))+ local old_size=7+ cur=' '+ local new_size=1+ (( index -= old_size - new_size ))+ (( ++i ))+ (( i <= cword ))+ [[ 1 -ge 0 ]]+ [[ '' != '' ]]+ (( i < cword ))+ (( ++i ))+ (( i <= cword ))+ [[ -n ]]+ [[ ! -n '' ]]+ cur=+ (( index < 0 ))+ local words cword cur+ _upvars -a2 words ifdown '' -v cword 1 -v cur ''+ (( 10 ))+ (( 10 ))+ case $1 in+ [[ -n 2 ]]+ printf %d 2+ [[ -n words ]]+ unset -v words+ eval 'words=("${@:3:2}")'++ words=("${@:3:2}")+ shift 4+ (( 6 ))+ case $1 in+ [[ -n cword ]]+ unset -v cword+ eval 'cword="$3"'++ cword=1+ shift 3+ (( 3 ))+ case $1 in+ [[ -n cur ]]+ unset -v cur+ eval 'cur="$3"'++ cur=+ shift 3+ (( 0 ))+ [[ -v vcur ]]+ upvars+=("$vcur")+ upargs+=(-v $vcur "$cur")+ [[ -v vcword ]]+ upvars+=("$vcword")+ upargs+=(-v $vcword "$cword")+ [[ -v vprev ]]+ [[ 1 -ge 1 ]]+ upvars+=("$vprev")+ upargs+=(-v $vprev "${words[cword - 1]}")+ [[ -v vwords ]]+ upvars+=("$vwords")+ upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})+ (( 4 ))+ local cur cword prev words+ _upvars -v cur '' -v cword 1 -v prev ifdown -a2 words ifdown ''+ (( 13 ))+ (( 13 ))+ case $1 in+ [[ -n cur ]]+ unset -v cur+ eval 'cur="$3"'++ cur=+ shift 3+ (( 10 ))+ case $1 in+ [[ -n cword ]]+ unset -v cword+ eval 'cword="$3"'++ cword=1+ shift 3+ (( 7 ))+ case $1 in+ [[ -n prev ]]+ unset -v prev+ eval 'prev="$3"'++ prev=ifdown+ shift 3+ (( 4 ))+ case $1 in+ [[ -n 2 ]]+ printf %d 2+ [[ -n words ]]+ unset -v words+ eval 'words=("${@:3:2}")'++ words=("${@:3:2}")+ shift 4+ (( 0 ))+ _variables+ [[ '' =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]+ [[ '' =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]+ [[ '' =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*]$ ]]+ return 1+ [[ '' == @(?([0-9])<|?([0-9&])>?(>)|>&)* ]]+ [[ ifdown == @(?([0-9])<|?([0-9&])>?(>)|>&) ]]+ local i skip+ (( i = 1 ))+ (( i < 2 ))+ [[ '' == @(?([0-9])<|?([0-9&])>?(>)|>&)* ]]+ (( i++ ))+ (( 1 ))+ (( i < 2 ))+ (( cword <= 0 ))+ prev=ifdown+ [[ -n false ]]+ _split_longopt+ [[ '' == --?*=* ]]+ return 1+ return 0+ case $prev in+ [[ '' == -* ]]+ local args+ _count_args '' '@(--allow|-i|--interfaces|--state-dir|-X|--exclude|-o)'+ local i cword words+ __reassemble_comp_words_by_ref '' words cword+ local exclude i j line ref+ [[ -n '' ]]+ printf -v cword %s 1+ [[ -v exclude ]]+ for i in "${!COMP_WORDS[@]}"+ printf -v 'words[i]' %s ifdown+ for i in "${!COMP_WORDS[@]}"+ printf -v 'words[i]' %s ''+ args=1+ (( i = 1 ))+ (( i < cword ))+ (( args == 1 ))+ _configured_interfaces+ [[ -f /etc/debian_version ]]+ COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p' /etc/network/interfaces /etc/network/interfaces.d/* 2> /dev/null)" -- "$cur"))+++ command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p' /etc/network/interfaces '/etc/network/interfaces.d/*'++ compgen -W 'loenp1s0' -- ''+ COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"))++ compgen -W '${COMPREPLY[@]}' -- ''+ local opt+ [[ complete -F _ifupdown ifdown == *\ \-\o\ * ]]+ return
Code:
+ [[ -f /etc/debian_version ]]+ COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p' /etc/network/interfaces /etc/network/interfaces.d/* 2> /dev/null)" -- "$cur"))+++ command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p' /etc/network/interfaces '/etc/network/interfaces.d/*'
Code:
user@debvirt12:~$ command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p' /etc/network/interfaces '/etc/network/interfaces.d/*'loenp1s0sed: can't read /etc/network/interfaces.d/*: No such file or directory
Is /root/ readable as simple user?I've just noticed something else strange w.r.t. sudo and bash tab completion. Again on bookworm (v12):
sudo md5sum /root<tabComplete> does not "work"
Code:
user@debvirt12:~$ ls -ld /root/drwx------ 3 root root 4096 Mar 29 13:45 /root/
Statistics: Posted by fabien — 2024-04-12 10:43 — Replies 6 — Views 116