From 72c9177db241cc7c080615aec03de44623affcfe Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Wed, 24 Apr 2019 14:22:44 +0200 Subject: bash-completion: properly autocomplete escaped unit names --- shell-completion/bash/journalctl | 3 ++- shell-completion/bash/systemctl.in | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/shell-completion/bash/journalctl b/shell-completion/bash/journalctl index 52ed2e3bcb..53ffaacdb5 100644 --- a/shell-completion/bash/journalctl +++ b/shell-completion/bash/journalctl @@ -86,6 +86,7 @@ _journalctl() { ;; --unit|-u) comps=$(journalctl -F '_SYSTEMD_UNIT' 2>/dev/null) + compopt -o filenames ;; --user-unit) comps=$(journalctl -F '_SYSTEMD_USER_UNIT' 2>/dev/null) @@ -100,7 +101,7 @@ _journalctl() { return 0 ;; esac - COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) + COMPREPLY=( $(compgen -o filenames -W '$comps' -- "$cur") ) return 0 fi diff --git a/shell-completion/bash/systemctl.in b/shell-completion/bash/systemctl.in index 8c86fed974..a827ed0d0e 100644 --- a/shell-completion/bash/systemctl.in +++ b/shell-completion/bash/systemctl.in @@ -119,6 +119,7 @@ __get_machines() { _systemctl () { local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} + local cur_orig=$cur local i verb comps mode local -A OPTS=( @@ -221,6 +222,13 @@ _systemctl () { fi done + # When trying to match a unit name with certain special characters in its name (i.e + # foo\x2dbar:01) they get escaped by bash along the way, thus causing any possible + # match to fail. Let's unescape such characters in the verb we're trying to + # autocomplete to avoid this, however, use the original verb (cur_orig) + # during the final match (COMPREPLY) + cur="$(echo $cur | xargs echo)" + if [[ -z $verb ]]; then comps="${VERBS[*]}" @@ -306,7 +314,7 @@ _systemctl () { | { while read -r a b; do echo " $a"; done; } ) fi - COMPREPLY=( $(compgen -o filenames -W '$comps' -- "$cur") ) + COMPREPLY=( $(compgen -o filenames -W '$comps' -- "$cur_orig") ) return 0 } -- cgit v1.2.1