Почему моя функция 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*'
Другие вопросы по тегам