Heyas
I'm trying to read out a file which contains a variable and use that list to complete a bash command.
Difficult part on this is, that 2 (actualy 3) different lists are to be used, but the 'dynamic' ones from the external file dont work properly.
It only seems to work with the list which is hardcoded into the bash_completion file, but not with variables from outside, though a simple echo at the wrong place, shows the value is read...
list1="a123 a456 a789"
list2="abc def ghi"
Then, for the actual bash completion, i'd expect this:
XY -c a${list[1}
XY -c b${list[2}
But what i get is this:
+ files $ ll [fr]* ; set -x ; . repro* ; cat file.list ; set +x
-rw-rw-r--. 1 sea sea 61 10. Apr 19:14 file.list
-rw-rw-r--. 1 sea sea 1.7K 10. Apr 19:49 reproducable.bash
+ . reproducable.bash
++ complete -F _XY_module XY
++ complete -F _XY_module XY.sh
+ cat file.list
section_task3="babc bdef bghi bjkg blmn bopq brst buvw bxyz"
+ set +x
:) files $ ll [fr]* ; set -x ; . repro*XY -c
a b
:) files $ XY -c a
a1024 a128 a192 a256 a384 a512 a768 a96
:) files $ XY -c b
a b
:) files $ XY -c b b
a b
:) files $ XY -c b b b
a b
:) files $ XY -c b b b a
a1024 a128 a192 a256 a384 a512 a768 a96
:) files $ XY -c b b b a1
a1024 a128 a192
This is a short version of the full bash_completition script, and beeing reproducable:
_XY_module()
{
#
# Variables
#
local cur prev OPTS
COMPREPLY=()
OPTS="-a -b"
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
[ -f file.list ] || printf "%s\n" "section_task2=\"abc def ghi jkg lmn opq rst uvw xyz\"" > file.list
section_task1="a96 a128 a192 a256 a384 a512 a768 a1024"
section_task2="b$(grep section_task2 file.list | sed s,section_task2=,, | sed s,\ ,\nb,)"
#
# Action
#
# This shows a list of words applying to your last argument
# These need manual maintainance
case "$prev" in
-c)
case $cur in
a*) COMPREPLY=( $( compgen -W "$(echo $section_task1|grep $cur*)" -- "$cur" ) )
return 0
;;
b*) COMPREPLY=( $( compgen -W "$(echo $section_task2|grep $cur*)" -- "$cur" ) )
return 0
;;
"") COMPREPLY=( $( compgen -W "a b" -- $cur) )
return 0
;;
esac
;;
XY|XY.sh)
COMPREPLY=( $(compgen -f -- $cur) )
return 0
;;
esac
# This completes the word you are currently writing
# These need manual maintainance
case $cur in
-*) COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
return 0
;;
a*) COMPREPLY=( $( compgen -W "$(echo $section_task1|grep $cur*)" -- "$cur" ) )
return 0
;;
b*) COMPREPLY=( $( compgen -W "$(echo $section_task2|grep $cur*)" -- "$cur" ) )
return 0
;;
*) COMPREPLY=( $( compgen -W "a b" -- $cur) )
return 0
;;
esac
}
# Actualy make it available to the shell
# Cover with and without extension
complete -F _XY_module XY
complete -F _XY_module XY.sh
Any advice or hints please?
Thank you in advance and have a nice weekend