Điểm:3

Hoàn thành Bash cho các nhánh git bị hỏng sau khi nâng cấp lên 21.10

lá cờ nl

Tôi không thể nhớ tôi đã lấy đoạn kịch bản này từ đâu, nhưng tôi .bashrc chứa các dòng sau:

# thiết lập tự động điền cho bí danh git
nếu [ -f "/usr/share/bash-completion/completions/git" ]; sau đó
  nguồn /usr/share/bash-completion/completions/git
  __git_complete gc _git_checkout
  __git_complete gp _git_pull
khác
  echo "Lỗi khi tải hoàn thành git"
fi

git_branch() {
  nhánh git 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

gcgp là bí danh cho kiểm tra gitkéo git tương ứng.

tôi có một /usr/share/bash-completion-completions/git vì vậy khi tôi nguồn ~/.bashrc không có gì lặp lại với dòng lệnh.

Trước khi nâng cấp lên 21.10 (21.04, 20.04 và 18.04 hoạt động tốt), tôi có thể gc kỳ tích<tab><tab> và nhận danh sách các chi nhánh bắt đầu bằng chiến công, nhưng bây giờ tôi gặp một lỗi lạ sau mỗi lần <tab>:

$ gc featbash: [: -lt: toán tử đơn nguyên dự kiến ​​// tab đầu tiên sau 'gc feat'
bash: [:: biểu thức số nguyên dự kiến
bash: [: -lt: toán tử đơn nguyên dự kiến
bash: [: -lt: toán tử đơn nguyên dự kiến
ure/bash: [: -lt: toán tử đơn nguyên dự kiến ​​// tab thứ hai sau 'ure/' (cái này được trả về bởi tab đầu tiên)
bash: [:: biểu thức số nguyên dự kiến
bash: [: -lt: toán tử đơn nguyên dự kiến
bash: [: -lt: toán tử một ngôi dự kiến ​​// tab thứ ba sau dòng này
bash: [: -lt: toán tử đơn nguyên dự kiến
bash: [:: biểu thức số nguyên dự kiến
bash: [: -lt: toán tử đơn nguyên dự kiến
bash: [: -lt: toán tử đơn nguyên dự kiến

Hiển thị tất cả 136 khả năng? (y hoặc n)

có biết thứ gì gây ra không?


CẬP NHẬT 1:

Tôi chỉ gặp lỗi này khi sử dụng bí danh - hoàn thành bằng lệnh đầy đủ kỳ công kiểm tra git<tab> hoạt động tốt. Khi tôi vim ~/.bash_aliases nó nhắc tôi khôi phục phiên bản trước và xóa tệp hoán đổi. Điều này tôi đã làm và mọi thứ đều ổn, nhưng tôi vẫn gặp lỗi.


CẬP NHẬT 2:

Đã thử nâng cấp, sau đó gỡ bỏ/cài đặt lại githoàn thành bash không có kết quả.

bash-completion đã là phiên bản mới nhất (1:2.11-2ubuntu1).
git đã là phiên bản mới nhất (1:2.32.0-1ubuntu1).

CẬP NHẬT 3:

đã làm một đặt -xv để kích hoạt dài dòng/gỡ lỗi. Dưới đây không phải là kết xuất đầy đủ nhưng bao gồm phần tạo thư:

$ gc kỳ công+ __git_func_wrap _git_checkout
+ từ địa phương cword prev
+ _get_comp_words_by_ref -n =: cur từ cword prev
+ cờ loại trừ cục bộ i OPTIND=1
+ từ =()
+ từ địa phương
+ upargs=()
+ upvars=()
+ upargs cục bộ upvars vcur vcword vprev vwords
+ getopts c:i:n:p:w: flag -n =: cur words cword prev
+ trường hợp $flag trong
+ loại trừ==:
+ getopts c:i:n:p:w: flag -n =: cur words cword prev
+ [[ 6 -ge 3 ]]
+ trường hợp ${!OPTIND} trong
+ vcur=cur
+ (( TÙY CHỌN += 1 ))
+ [[ 6 -ge 4 ]]
+ trường hợp ${!OPTIND} trong
+ vwords=từ
+ (( TÙY CHỌN += 1 ))
+ [[ 6 -ge 5 ]]
+ trường hợp ${!OPTIND} trong
+ vcword=cword
+ (( TÙY CHỌN += 1 ))
+ [[ 6 -ge 6 ]]
+ trường hợp ${!OPTIND} trong
+ vprev=trước
+ (( TÙY CHỌN += 1 ))
+ [[ 6 -ge 7 ]]
+ __get_cword_at_cursor_by_ref =: từ cword cur
+ từ =()
+ từ cword địa phương
+ __reassemble_comp_words_by_ref =: từ cword
+ loại trừ cục bộ i j dòng giới thiệu
+ [[ -n =: ]]
+ loại trừ='[=:]'
+ printf -v cword %s 1
+ [[ -v loại trừ ]]
+ line='gc kỳ công'
+ (( i = 0, j = 0 ))
+ (( i < 2 ))
+ [[ 0 -gt 0 ]]
+ ref='từ[0]'
+ printf -v 'words[0]' %s gc
+ dòng='kỳ công'
+ (( i == COMP_CWORD ))
+ (( i++, j++ ))
+ (( i < 2 ))
+ [[ 1 -gt 0 ]]
+ [[ kỳ công == +([=:]) ]]
+ ref='từ[1]'
+ printf -v 'từ[1]' %s kỳ tích
+ dòng=
+ (( 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 kỳ công ]]
+ [[ -n gcfeat ]]
+ cur='gc kỳ tích'
+ (( i = 0 ))
+ (( i <= cword ))
+ [[ 7 -ge 2 ]]
+ [[ gc != \g\c ]]
+ (( i < cword ))
+ cục bộ old_size=7
+ cur='kỳ công'
+ cục bộ new_size=5
+ (( chỉ mục -= old_size - new_size ))
+ (( ++i ))
+ (( i <= cword ))
+ [[ 5 -ge 4 ]]
+ [[ fea != \f\e\a\t ]]
+ cur=kỳ công
+ (( chỉ số > 0 ))
+ (( chỉ số-- ))
+ [[ 4 -ge 4 ]]
+ [[ kỳ công != \f\e\a\t ]]
+ (( i < cword ))
+ (( ++i ))
+ (( i <= cword ))
+ [[ -n kỳ công ]]
+ [[ ! -n kỳ công ]]
+ (( chỉ số < 0 ))
+ từ địa phương cword cur
+ _upvars -a2 từ gc feat -v cword 1 -v cur feat
+ (( 10 ))
+ (( 10 ))
+ trường hợp $1 trong
+ [[ -n 2 ]]
+ printf %d 2
+ [[ -n từ ]]
+ bỏ đặt -v từ
+ eval 'words=("${@:3:2}")'
từ=("${@:3:2}")
++ từ=("${@:3:2}")
+ ca 4
+ (( 6 ))
+ trường hợp $1 trong
+ [[ -n cword ]]
+ bỏ đặt -v cword
+ eval 'cword="$3"'
cword="$3"
++ cword=1
+ ca 3
+ (( 3 ))
+ trường hợp $1 trong
+ [[ -n cur ]]
+ bỏ đặt -v cur
+ eval 'cur="$3"'
cur="$3"
++ cur=kỳ công
+ ca 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 "${words[cword - 1]}")
+ [[ -v vwords ]]
+ upvars+=("$vwords")
+ upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})
+ (( 4 ))
+ địa phương cur cword prev từ
+ _upvars -v cur feat -v cword 1 -v prev gc -a2 từ gc feat
+ (( 13 ))
+ (( 13 ))
+ trường hợp $1 trong
+ [[ -n cur ]]
+ bỏ đặt -v cur
+ eval 'cur="$3"'
cur="$3"
++ cur=kỳ công
+ ca 3
+ (( 10 ))
+ trường hợp $1 trong
+ [[ -n cword ]]
+ bỏ đặt -v cword
+ eval 'cword="$3"'
cword="$3"
++ cword=1
+ ca 3
+ (( 7 ))
+ trường hợp $1 trong
+ [[ -n trước ]]
+ bỏ đặt -v trước
+ eval 'prev="$3"'
trước="$3"
++ trước=gc
+ ca 3
+ (( 4 ))
+ trường hợp $1 trong
+ [[ -n 2 ]]
+ printf %d 2
+ [[ -n từ ]]
+ bỏ đặt -v từ
+ eval 'words=("${@:3:2}")'
từ=("${@:3:2}")
++ từ=("${@:3:2}")
+ ca 4
+ (( 0 ))
+ _git_checkout
+ __git_has_doubledash
+ cục bộ c=1
+ '[' 1 -lt 1 ']'
+ trả lại 1
++ __git_checkout_default_dwim_mode
++ local last_option dwim_opt=-dwim
++ '[''' = 1 ']'
+++ __git_find_on_cmdline --no-track
+++ từ địa phương c= show_idx
+++ kiểm tra 1 -gt 1
+++ danh sách từ địa phương=-no-track
+++ '[' -lt 1 ']'
bash: [: -lt: toán tử đơn nguyên dự kiến
++ '[' -n '' ']'
+++ __git config --type=bool checkout.guess
+++ git config --type=bool checkout.guess
++ '[''' = sai ']'
+++ __git_find_last_on_cmdline '--đoán --không-đoán'
+++ từ địa phương c=1 show_idx
+++ kiểm tra 1 -gt 1
+++ local 'wordlist=--guess --no-guess'
+++ '[' 1 -gt '' ']'
bash: [:: biểu thức số nguyên dự kiến
++ cuối_option=
++ trường hợp "$last_option" trong
++ tiếng vang --dwim
+ cục bộ dwim_opt=-dwim
+ trường hợp "$prev" trong
+ trường hợp "$cur" trong
++ __git_find_on_cmdline '-b -B -d --detach --orphan'
++ từ địa phương c= show_idx
++ kiểm tra 1 -gt 1
++ local 'wordlist=-b -B -d --detach --orphan'
++ '[' -lt 1 ']'
bash: [: -lt: toán tử đơn nguyên dự kiến
+ '[' -n'' ']'
++ __git_find_on_cmdline --theo dõi
++ từ địa phương c= show_idx
++ kiểm tra 1 -gt 1
++ danh sách từ cục bộ=--theo dõi
++ '[' -lt 1 ']'
bash: [: -lt: toán tử đơn nguyên dự kiến

Lưu ý rằng đây không phải là kết xuất đầy đủ, chỉ là các bit tối đa và bao gồm cả vị trí tạo thông báo lỗi. Tôi đã thử theo dõi lại một trong các thông báo lỗi thông qua tập lệnh và tìm thấy thông báo này trong /usr/share/bash-completion/completions/git:

# Kiểm tra xem một trong những từ đã cho có xuất hiện trên dòng lệnh hay không,
# và in từ đầu tiên được tìm thấy.
#
# Cách sử dụng: __git_find_on_cmdline [<option>]... "<wordlist>"
# --show-idx: Tùy chọn hiển thị chỉ mục của từ tìm thấy trong mảng $words.
__git_find_on_cmdline ()
{
        từ địa phương c="$__git_cmd_idx" show_idx

        trong khi kiểm tra $# -gt 1; làm
                trường hợp "$1" trong
                --show-idx) show_idx=y ;;
                *) trả về 1 ;;
                thoát hiểm
                sự thay đổi
        xong
        danh sách từ cục bộ="$1"

        trong khi [ $c -lt $cword ]; làm
                cho từ trong $wordlist; làm
                        nếu [ "$word" = "${words[c]}" ]; sau đó
                                nếu [ -n "${show_idx-}" ]; sau đó
                                        tiếng vang "$c $word"
                                khác
                                        tiếng vang "$ từ"
                                fi
                                trở lại
                        fi
                xong
                ((C++))
        xong
}

Có vẻ như có lẽ dòng từ địa phương c="$__git_cmd_idx" show_idx là để đổ lỗi, như c trông trống rỗng đối với -lt so sánh sau khi kích hoạt toán tử đơn nguyên dự kiến.

Tại sao điều này không còn hoạt động sau khi cập nhật?

Điểm:4
lá cờ cn

Điều này đã được đăng như một lỗi trên hoàn thành bash GitHub. Vấn đề đã được giải quyết trong Git 2.33.0.

Cho đến khi bản sửa lỗi này được chuyển xuống kho lưu trữ Ubuntu, bạn có thể thực hiện một cách giải quyết khác như sau:

Trong tập tin /usr/share/bash-completion/completions/git, biến đổi

__git_func_wrap ()
{
    từ địa phương cword prev

vào trong

__git_func_wrap ()
{
    từ cục bộ cword prev __git_cmd_idx=1

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.