! # $
у меня работает. Дано:
$ 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
В дополнение к полезному ответу слоя 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
.
В документации 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);