Hoàn thành bash sau đây chuyển một loạt các từ có thể (tức là các lần hoàn thành) để tổng hợp.Tự động hoàn thành Bash - Cách chuyển mảng này để biên dịch mà không có khoảng trống đáng kể bị thu gọn?
basenames=("foo" "fu bar" "baz");
COMPREPLY=($(compgen -W "${basenames[*]}" -- "${COMP_WORDS[COMP_CWORD]}"))
Vấn đề là khoảng trắng trong phần tử mảng không được giữ nguyên, đó là "thanh foo" được coi là thành phần nhờ tách từ. Có cách nào để bảo vệ khoảng trống, sao cho 3 phần tử được hiển thị chứ không phải 4?
EDIT
basenames
chứa tên tập tin, đó là hầu hết các nhân vật (ngoài/và \ 0) được cho phép.
EDIT 2
Cờ -W hy vọng một từ duy nhất, đó là một cái gì đó giống như foo bar foobar
. Chuyển nhiều phần tử cho nó (đây là những gì ${basenames[@]}
sẽ làm) sẽ không hoạt động.
EDIT 3
Thay đổi mảng basenames examplary (vì vậy foo
và foo
từ foo bar
sẽ không bị sụp đổ).
Sử dụng một dòng mới để tách các từ hoạt động:
local IFS=$'\n'
COMPREPLY=($(compgen -W "$(printf "%s\n" "${basenames[@]}")" -- ${COMP_WORDS[COMP_CWORD]}"))
Sử dụng \0
không:
local IFS=$'\0'
COMPREPLY=($(compgen -W "$(printf "%s\0" "${basenames[@]}")" -- ${COMP_WORDS[COMP_CWORD]}"))
+1 Đây là cách tôi thực sự đạt được những gì tôi muốn. Lời khuyên thực sự tốt! – helpermethod
"$ 2" và "## * /" là gì? – oluc
## */xóa đầu cho đến '/' cuối cùng; $ 2 là từ hoàn thành hiện tại; phải không? – oluc