Puncte:3

Finalizare Bash pentru ramurile git rupte după actualizarea la 21.10

drapel nl

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?

Puncte:4
drapel cn

Acest lucru a fost postat ca un bug pe GitHub-ul finalizării bash. Problema a fost rezolvată în Git 2.33.0.

Până când această remediere se scurge în depozitele Ubuntu, puteți face o soluție după cum urmează:

În dosar /usr/share/bash-completion/completions/git, Schimbare

__git_func_wrap ()
{
    cuvinte locale cur cword prev

în

__git_func_wrap ()
{
    cuvinte locale cur cword prev __git_cmd_idx=1

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.