Почему моя функция bash заполняет подстановочные знаки для переменных?
В моем ~/.bash_aliases:
function wtf (){
echo $1;
}
Тестирование в bash:
>> wtf t*
testes
WTF?
Теперь, когда я понял, что bash анализирует мой шаблон, прежде чем передать его, я решил поделиться функцией, которую я строил. Вот последняя версия моего ярлыка рекурсивного удаления:
# delete recursively
function rmr () {
find . -name "$1" -type f -delete -exec \
echo $(tput setaf 1)"deleted >"$(tput setaf 2) {} \; ;
l;
}
2 ответа
Потому что у вас есть файл с именем testes
и Баш заменяет t*
с этим, прежде чем передавать аргументы wtf()
, У вас может быть несколько файлов, начинающихся с t
, но testes
является первым, и wtf
только эхо $1
, Если вы замените $1
с $*
Вы увидите их всех.
Например, если у вас есть файлы testes
а также tumble
(и нет другого файла, начинающегося с t
) и выпустить
wtf t*
Баш заменит t*
с testes tumble
(через пробел), а затем оценить строку
wtf testes tumble
что приведет к wtf
быть переданным testes
как $1
а также tumble
как $2
,
Если вы не хотите, чтобы оболочка выполняла расширение имени файла, вы должны заключить в кавычки аргумент, например: wtf 't*'
или же wtf "t*"
, Одиночные кавычки имеют то преимущество, что не только избегают расширения имени файла, но и любого другого вида расширения (например, расширение параметра и расширение переменной). Расширение имени файла (или пути) происходит с *
, ?
(среди прочих), расширение параметров и переменных с $
,
По той же причине вы должны процитировать аргумент echo
на этот раз в двойных кавычках, потому что вы хотите расширение параметра $1
случиться, но не хочу (снова!) расширения имени файла произойти:
function wtf() {
echo "$1"
}
man bash
Ваш друг, есть чему поучиться.
В man bash
, тип /^EXPANSION
или же /Pathname Expansion
, Смотрите также /^QUOTING
,
Вот так работают снаряды. Это не ваша функция, выполняющая расширение, а оболочка, которая делает это перед вызовом вашей функции.
Вам нужно будет цитировать все, что вы хотите сохранить (в том числе глобусные символы *
а также ?
) при вызове функции и внутри функции.
wtf() {
echo "$1"
}
wtf 't*'