निम्नलिखित बैश समापन संभव शब्दों (यानी पूर्णता) की एक सरणी compgen करने के लिए गुजरता है।बैश स्वत: पूर्णता - इस सरणी को बिना किसी महत्वपूर्ण व्हाइटस्पेस के संकलन के कंपेन में कैसे पास किया जाए?
basenames=("foo" "fu bar" "baz");
COMPREPLY=($(compgen -W "${basenames[*]}" -- "${COMP_WORDS[COMP_CWORD]}"))
समस्या यह है कि है "foo बार" शब्द बंटवारे के लिए तत्वों धन्यवाद करने के लिए माना जाता है, कि सरणी तत्वों में खाली स्थान के संरक्षित नहीं किया जाता है। क्या व्हाइटस्पेस को संरक्षित करने का कोई तरीका है, ताकि 3 तत्व दिखाए जाएं, और 4 नहीं?
संपादित
basenames
, फ़ाइल नाम होता है, जो लगभग हर चरित्र है (से अलग/और \ 0) की अनुमति दी है।
संपादित 2
डब्ल्यू झंडा एक शब्द भी उम्मीद है, कि foo bar foobar
की तरह कुछ है। इसमें कई तत्वों को पास करना (यह ${basenames[@]}
करेगा) काम नहीं करेगा।
संपादित 3
बदल दिया examplary basenames सरणी (ताकि foo
और foo bar
से foo
ढह नहीं हो जाएगा)।
एक नई पंक्ति का उपयोग करते हुए शब्द को अलग करने के काम करता है:
local IFS=$'\n'
COMPREPLY=($(compgen -W "$(printf "%s\n" "${basenames[@]}")" -- ${COMP_WORDS[COMP_CWORD]}"))
\0
का प्रयोग नहीं करता है:
local IFS=$'\0'
COMPREPLY=($(compgen -W "$(printf "%s\0" "${basenames[@]}")" -- ${COMP_WORDS[COMP_CWORD]}"))
+1 इस प्रकार मैंने वास्तव में जो हासिल किया था वह हासिल किया। वास्तव में अच्छी सलाह! – helpermethod
"$ 2" और "## * /" क्या हैं? – oluc
## */आखिरी '/' तक सिर हटा देता है; $ 2 वर्तमान समापन शब्द है; सही? – oluc