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)/'
}
gc
và gp
là bí danh cho kiểm tra git
và ké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 git
và hoà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?