Nu-mi amintesc de unde am luat acest fragment de scenariu, dar al meu .bashrc
conține următoarele rânduri:
# configurați completarea automată pentru aliasurile git
if [ -f "/usr/share/bash-completion/completions/git" ]; atunci
sursa /usr/share/bash-completion/completions/git
__git_complete gc _git_checkout
__git_complete gp _git_pull
altfel
echo „Eroare la încărcarea completărilor git”
fi
git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
gc
și gp
sunt pseudonime pentru git checkout
și git pull
respectiv.
Am un /usr/share/bash-completion-completions/git
deci când eu sursa ~/.bashrc
nu există niciun ecou în linia de comandă.
Înainte de a face upgrade la 21.10 (21.04, 20.04 și 18.04 au funcționat bine), aș putea gc feat<tab><tab>
și obțineți o listă de ramuri începând cu feat
, dar acum primesc o eroare ciudată după fiecare <tab>
:
$ gc featbash: [: -lt: operator unar așteptat // prima filă după „gc feat”
bash: [:: expresie întreagă așteptată
bash: [: -lt: se așteaptă un operator unar
bash: [: -lt: se așteaptă un operator unar
ure/bash: [: -lt: operator unar așteptat // a doua filă după „ure/” (acesta a fost returnat de prima filă)
bash: [:: expresie întreagă așteptată
bash: [: -lt: se așteaptă un operator unar
bash: [: -lt: operator unar așteptat // a treia filă după această linie
bash: [: -lt: se așteaptă un operator unar
bash: [:: expresie întreagă așteptată
bash: [: -lt: se așteaptă un operator unar
bash: [: -lt: se așteaptă un operator unar
Afișați toate cele 136 de posibilități? (y sau n)
Ai idee ce cauzează asta?
ACTUALIZARE 1:
Primesc această eroare doar când folosesc aliasurile - finalizare folosind comanda completă git checkout feat<tab>
Merge bine. Cand eu vim ~/.bash_aliases
mi-a cerut să recuperez o versiune anterioară și să șterg fișierul swap. Am făcut asta și totul arată bine, dar încă primesc eroarea.
UPDATE 2:
Am încercat să fac upgrade, apoi să elimin/reinstalez git
și bash-completare
fără niciun rezultat.
bash-completion este deja cea mai nouă versiune (1:2.11-2ubuntu1).
git este deja cea mai nouă versiune (1:2.32.0-1ubuntu1).
ACTUALIZARE 3:
A făcut un set -xv
pentru a activa verbose/debug. Mai jos nu este descărcarea completă, dar include partea în care sunt create mesajele:
$ gc feat+ __git_func_wrap _git_checkout
+ cuvinte locale cur cword prev
+ _get_comp_words_by_ref -n =: cur cuvinte cword prev
+ flag de excludere locală i OPTIND=1
+ cuvinte=()
+ cuvinte locale cur cword
+ upargs=()
+ upvars=()
+ upargs locale upvars vcur vcword vprev vwords
+ getopts c:i:n:p:w: flag -n =: cur cuvinte cword prev
+ case $flag in
+ exclude==:
+ getopts c:i:n:p:w: flag -n =: cur cuvinte cword prev
+ [[ 6 -ge 3 ]]
+ caz ${!OPTIND} în
+ vcur=cur
+ (( OPTIND += 1 ))
+ [[ 6 -ge 4 ]]
+ caz ${!OPTIND} în
+ vwords=cuvinte
+ (( OPTIND += 1 ))
+ [[ 6 -ge 5 ]]
+ caz ${!OPTIND} în
+ vcword=cword
+ (( OPTIND += 1 ))
+ [[ 6 -ge 6 ]]
+ caz ${!OPTIND} în
+ vprev=prev
+ (( OPTIND += 1 ))
+ [[ 6 -ge 7 ]]
+ __get_cword_at_cursor_by_ref =: cuvinte cword cur
+ cuvinte=()
+ cuvinte cword locale
+ __reassemble_comp_words_by_ref =: cuvinte cword
+ local exclude i j linie ref
+ [[ -n =: ]]
+ exclude='[=:]'
+ printf -v cword %s 1
+ [[ -v exclude ]]
+ line='gc feat'
+ (( i = 0, j = 0 ))
+ (( i < 2 ))
+ [[ 0 -gt 0 ]]
+ ref='cuvinte[0]'
+ printf -v 'cuvinte[0]' %s gc
+ line='feat'
+ (( i == COMP_CWORD ))
+ (( i++, j++ ))
+ (( i < 2 ))
+ [[ 1 -gt 0 ]]
+ [[ feat == +([=:]) ]]
+ ref='cuvinte[1]'
+ printf -v 'cuvinte[1]' %s feat
+ linie=
+ (( i == COMP_CWORD ))
+ printf -v cword %s 1
+ (( i++, j++ ))
+ (( i < 2 ))
+ (( i == COMP_CWORD ))
+ local i cur= index=7 'lead=gc feat'
+ [[ 7 -gt 0 ]]
+ [[ -n gc feat ]]
+ [[ -n gcfeat ]]
+ cur='gc feat'
+ (( i = 0 ))
+ (( i <= cword ))
+ [[ 7 -ge 2 ]]
+ [[ gc != \g\c ]]
+ (( i < cword ))
+ local old_size=7
+ cur=' feat'
+ local new_size=5
+ (( index -= mărime_veche - mărime_nouă ))
+ (( ++i ))
+ (( i <= cword ))
+ [[ 5 -ge 4 ]]
+ [[ fea != \f\e\a\t ]]
+ cur=feat
+ (( index > 0 ))
+ (( index-- ))
+ [[ 4 -ge 4 ]]
+ [[ feat != \f\e\a\t ]]
+ (( i < cword ))
+ (( ++i ))
+ (( i <= cword ))
+ [[ -n feat ]]
+ [[ ! -n feat ]]
+ (( indice < 0 ))
+ cuvinte locale cword cur
+ _upvars -a2 cuvinte gc feat -v cword 1 -v cur feat
+ (( 10 ))
+ (( 10 ))
+ carcasa de 1 USD in
+ [[ -n 2 ]]
+ printf %d 2
+ [[ -n cuvinte ]]
+ unset -v cuvinte
+ eval 'words="("${@:3:2}")'
cuvinte=(„${@:3:2}”)
++ cuvinte=(„${@:3:2}”)
+ tura 4
+ (( 6 ))
+ carcasa de 1 USD in
+ [[ -n cword ]]
+ unset -v cword
+ eval 'cword="$3"'
cword="$3"
++ cword=1
+ tura 3
+ (( 3 ))
+ carcasa de 1 USD in
+ [[ -n cur ]]
+ unset -v cur
+ eval 'cur="$3"'
cur="$3"
++ cur=feat
+ tura 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 „${cuvinte[cword - 1]}”)
+ [[ -v vwords ]]
+ upvars+=("$vcuvinte")
+ upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})
+ (( 4 ))
+ cuvintele anterioare cur cword local
+ _upvars -v cur feat -v cword 1 -v prev gc -a2 cuvinte gc feat
+ (( 13 ))
+ (( 13 ))
+ carcasa de 1 USD in
+ [[ -n cur ]]
+ unset -v cur
+ eval 'cur="$3"'
cur="$3"
++ cur=feat
+ tura 3
+ (( 10 ))
+ carcasa de 1 USD in
+ [[ -n cword ]]
+ unset -v cword
+ eval 'cword="$3"'
cword="$3"
++ cword=1
+ tura 3
+ (( 7 ))
+ carcasa de 1 USD in
+ [[ -n prev ]]
+ unset -v prev
+ eval 'prev="$3"'
prev="$3"
++ prev=gc
+ tura 3
+ (( 4 ))
+ carcasa de 1 USD in
+ [[ -n 2 ]]
+ printf %d 2
+ [[ -n cuvinte ]]
+ unset -v cuvinte
+ eval 'words="("${@:3:2}")'
cuvinte=(„${@:3:2}”)
++ cuvinte=(„${@:3:2}”)
+ tura 4
+ (( 0 ))
+ _git_checkout
+ __git_has_doubledash
+ local c=1
+ '[' 1 -lt 1 ']'
+ întoarcere 1
++ __git_checkout_default_dwim_mode
++ local last_option dwim_opt=--dwim
++ '[' '' = 1 ']'
+++ __git_find_on_cmdline --no-track
+++ cuvânt local c= show_idx
+++ test 1 -gt 1
+++ lista de cuvinte locale=--no-track
+++ '[' -lt 1 ']'
bash: [: -lt: se așteaptă un operator unar
++ '[' -n '' ']'
+++ __git config --type=bool checkout.guess
+++ git config --type=bool checkout.guess
++ '[' '' = fals ']'
+++ __git_find_last_on_cmdline '--guess --no-guess'
+++ cuvânt local c=1 show_idx
+++ test 1 -gt 1
+++ local 'wordlist=--guess --no-guess'
+++ '[' 1 -gt '' ']'
bash: [:: expresie întreagă așteptată
++ ultima_opțiune=
++ caz „$last_option” în
++ echo --dwim
+ local dwim_opt=--dwim
+ caz „$prev” în
+ caz „$cur” în
++ __git_find_on_cmdline '-b -B -d --detach --orphan'
++ cuvânt local c= show_idx
++ test 1 -gt 1
++ local 'wordlist=-b -B -d --detach --orphan'
++ '[' -lt 1 ']'
bash: [: -lt: se așteaptă un operator unar
+ '[' -n '' ']'
++ __git_find_on_cmdline --track
++ cuvânt local c= show_idx
++ test 1 -gt 1
++ lista de cuvinte locale=--track
++ '[' -lt 1 ']'
bash: [: -lt: se așteaptă un operator unar
Rețineți că aceasta nu este o descărcare completă, ci doar biții până la și inclusiv locul unde sunt generate mesajele de eroare. Am încercat să urmăresc unul dintre mesajele de eroare înapoi prin script și am găsit asta în /usr/share/bash-completion/completions/git
:
# Verificați dacă unul dintre cuvintele date este prezent pe linia de comandă,
# și tipăriți primul cuvânt găsit.
#
# Utilizare: __git_find_on_cmdline [<opțiune>]... „<listă de cuvinte>”
# --show-idx: Afișează opțional indexul cuvântului găsit în matricea $words.
__git_find_on_cmdline ()
{
cuvânt local c="$__git_cmd_idx" show_idx
în timp ce testul $# -gt 1; do
cazul „$1” în
--show-idx) show_idx=y ;;
*) returnează 1 ;;
esac
schimb
Terminat
listă de cuvinte locală="$1"
while [ $c -lt $cword ]; do
pentru cuvânt în $listă de cuvinte; do
if [ "$cuvânt" = "${cuvinte[c]}" ]; atunci
dacă [ -n "${show_idx-}" ]; atunci
echo „$c $cuvânt”
altfel
ecou „$cuvânt”
fi
întoarcere
fi
Terminat
((c++))
Terminat
}
Se pare că poate linia cuvânt local c="$__git_cmd_idx" show_idx
este de vina, ca c
pare gol la -lt
comparație ulterioară la declanșarea operatorului unar așteptat.
De ce nu ar mai funcționa după actualizare?