From: Michal Privoznik Date: Tue, 20 Apr 2021 13:03:16 +0000 (+0200) Subject: bash-completion: Fix argument passing to $1 X-Git-Tag: v7.3.0-rc1~78 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7657804df7126bc69b9b7a52c710dbad153b6ae4;p=thirdparty%2Flibvirt.git bash-completion: Fix argument passing to $1 Our vsh bash completion string is merely just a wrapper over virsh/virt-admin complete (cmdComplete) - a hidden command that uses internal readline completion to generate list of candidates. But this means that we have to pass some additional arguments to the helper process: e.g. connection URI and R/O flag. Candidates are printed on a separate line each (and can contain space), which means that when bash is reading the helper's output into an array, it needs to split items on '\n' char - hence the IFS=$'\n' prefix on the line executing the helper. This was introduced in b889594a70. But this introduced a regression - those extra arguments we might pass are stored in a string and previously were split on a space character (because $IFS was kept untouched and by default contains space). But now, after the fix that's no longer the case and thus virsh/virt-admin sees ' -r -c URI' as one argument. The solution is to take $IFS out of the picture by storing the extra arguments in an array instead of string. Fixes: b889594a7092440dc916e3f43eeeaca2684571ee Signed-off-by: Michal Privoznik Reviewed-by: Erik Skultety --- diff --git a/tools/bash-completion/vsh b/tools/bash-completion/vsh index bbb25fc3eb..402945a8c5 100644 --- a/tools/bash-completion/vsh +++ b/tools/bash-completion/vsh @@ -30,12 +30,12 @@ _vsh_complete() c=$((++c)) done - CMDLINE= + CMDLINE=( ) if [ -n "${RO}" ]; then - CMDLINE="${CMDLINE} -r" + CMDLINE+=("-r") fi if [ -n "${URI}" ]; then - CMDLINE="${CMDLINE} -c ${URI}" + CMDLINE+=("-c" "${URI}") fi INPUT=( "${COMP_WORDS[@]:$i:$COMP_CWORD}" ) @@ -56,7 +56,7 @@ _vsh_complete() # the name of the command whose arguments are being # completed. # Therefore, we might just run $1. - IFS=$'\n' A=($($1 ${CMDLINE} complete -- "${INPUT[@]}" 2>/dev/null)) + IFS=$'\n' A=($($1 ${CMDLINE[@]} complete -- "${INPUT[@]}" 2>/dev/null)) COMPREPLY=($(compgen -W "${A[*]%--}" -- ${cur})) __ltrim_colon_completions "$cur"