Почему nullglob влияет на завершение табуляции?

В windows / cygwin ... у меня это сработало:

#!/bin/bash -xe

browser="/cygdrive/c/Program Files (x86)/Google/Chrome/Application/chrome.exe"

clients="fb aapl nflx "

for i in $clients
do
        "$browser" --new-tab https://asite.com/dashboard/$i
done
7
13.04.2017, 15:36
1 ответ

В отличие от ] extglob , nullglob имеет огромное значение в поведении оболочки. Это означает, что слово, содержащее подстановочные знаки, которые, скорее всего, не будут совпадать, приведет к тому, что слово исчезнет, ​​а не останется.

В большинстве случаев код, который прерывается с помощью nullglob , также не работает без него, если определенный каталог содержит файлы, которые соответствуют шаблону без кавычек. В зависимости от шаблона существование таких файлов может быть более или менее вероятным (и это может быть невозможно, если сценарии контролируют, какие имена файлов присутствуют, например, потому что он переключается на временный каталог, который он заполняет).

На завершение по табуляции в Bash по умолчанию не влияет nullglob, но это влияет, если вы включаете программируемое завершение, потому что часть кода bash, реализующего программируемое завершение, не является надежным.

Глядя на то, что происходит при завершении аргумента ls с включенным set -x , я вижу, что результат с и без nullglob начинает различаться на

+ [[ 0 -gt 0 ]]
+ ref='words[0]'
+ eval 'words[0]=${!ref}${COMP_WORDS[i]}'
++ words[0]=ls
+ line=' '

(работает) против

+ [[ 0 -gt 0 ]]
+ ref='words[0]'
+ eval
+ line=' '

с nullglob. Видите эту строку eval ? Это признак того, что аргумент выглядел как шаблон. Соответствующий код находится в функции __ reassemble_comp_words_by_ref :

                # Append word separator to current or new word
                ref="$2[$j]"
                eval $2[$j]=\${!ref}\${COMP_WORDS[i]}

[ - это подстановочный знак, поэтому $ 2 [$ j] = \ $ {! ref} \ $ {COMP_WORDS [i]} является подстановочным знаком, а с nullglob он исключен, поскольку он ничего не соответствует. Это также было бы безубыточным без nullglob , если бы текущий каталог содержал файл с именем words0 = $ {! Ref} $ {COMP_WORDSi} - это довольно экзотично, но такое может случиться.

Исправление заключается в добавлении недостающих двойных кавычек:

                eval "$2[$j]=\${!ref}\${COMP_WORDS[i]}"

Возможно, есть другие части этого скрипта, которые нуждаются в подобных исправлениях, я не исследовал их дальше.

Это ошибка в bash_completion (не в самом bash). Об этом сообщалось в 2012 году , и его исправление предусмотрено в дорожной карте для версии 3.0.

9
27.01.2020, 20:17

Теги

Похожие вопросы