2016-10-07 3 views
1

В GNU bash, версия 3.2.57, я вижу конфликт между использованием declare для печати переменной массива и опцией nullglob.Nullglob разрывает объявление печати массива

Эти два кажутся мне очень не связанными, но разве это намеренно, когда включен nullglob?

#!/bin/bash 

test() { 
    local FOO="xyz" 
    local BAR=("one" "two" "three") 
    declare -p FOO 
    declare -a -p BAR 
} 

echo $(test) 
shopt -s nullglob 
echo $(test) 
shopt -u nullglob 
echo $(test) 

Выход:

declare -- FOO="xyz" declare -a BAR='([0]="one" [1]="two" [2]="three")' 
declare -- FOO="xyz" declare -a 
declare -- FOO="xyz" declare -a BAR='([0]="one" [1]="two" [2]="three")' 

Обратите внимание на средней линии, когда nullglob установлен, не декларация BAR не излучается.

ответ

2

Проблема не в nullglob, но не при цитировании команды echo.

Если вы цитируете его, то он должен работать нормально:

shopt -s nullglob 
echo "$(test)" 
declare -- FOO="xyz" 
declare -a BAR='([0]="one" [1]="two" [2]="three")' 

Без процитировать оболочки пытаются расширить выход test функции, поскольку есть много символов GLOB в выводе.

Если установлено nullglob, то сбой расширения и ничего не печатается в случае неудачного выражения glob.

+1

Ах, интересно. Я не понимал, что мне нужно процитировать '$()'. Я приму ваш ответ через несколько минут, когда это позволит. Благодаря! – rgov

1

Не указывая echo $(test), тогда $(test) часть подлежит расширению имени пути. Результат declare -p содержит [] символов, которые проверяются файловой системой. Когда nullglob установлен, и нет соответствующих файлов, это слово удаляется.

Попробуйте установить shopt -s failglob, чтобы узнать, что происходит более подробно; отсутствие совпадающих файлов приведет к ошибке.

Смежные вопросы