Почему не исходный код lib / * work?

! # $ у меня работает. Дано:

$ echo a

Набрав ! # $ , затем нажатие Tab расширяет ! # $ на a . Завершение табуляции также перечисляет другие варианты, если вы попытаетесь выполнить операцию с : :

$ echo a !#$:
&  -- repeat substitution
A  -- absolute path resolving symbolic links
Q  -- strip quotes
a  -- absolute path
c  -- PATH search for command
e  -- leave only extension
g  -- globally apply s or &
h  -- head - strip trailing path element
l  -- lower case all words
q  -- quote to escape further substitutions
r  -- root - strip suffix
s  -- substitute string
t  -- tail - strip directories
u  -- upper case all words
11
04.10.2017, 17:21
2 ответа

В дополнение к полезному ответу слоя b -я бы посоветовал никогда не использовать расширение greedy glob, если вы не уверены, существуют ли файлы того типа, который пытается расшириться.

Когда вы сделали это ниже, возможно, что файл (не имеет .shрасширения ), просто временный файл, содержащий некоторые вредоносные команды (, например.rm -rf *)которые могут быть выполнены (при условии, что у них есть права на выполнение)

source lib/*

Поэтому всегда выполняйте расширение глобуса с правильным набором границ, хотя в вашем случае вы можете просто зацикливаться только на *.shфайлах

for globFile in lib/*.sh; do
    [ -f "$globFile" ] || continue
    source "$globFile"
done

Здесь [ -f "$globFile" ] || continueпозаботится о выходе из цикла, если в текущей папке нет совпадений шаблона глобуса, т. е. эквивалент расширенных опций оболочки nullglobв оболочке bash.

5
27.01.2020, 19:57

В документации Bash указано, что sourceработает с одним именем файла :

. (a period)

. filename [arguments]

Read and execute commands from the filename argument in the current shell context. If filename...

И исходный код... для источник ... подтверждает это:

result = source_file (filename, (list && list->next));

Где source_fileопределено вevalfile.cдля вызова_evalfile:

rval = _evalfile (filename, flags);

и _evalfileоткрывает только один файл:

fd = open (filename, O_RDONLY);
7
27.01.2020, 19:57

Теги

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