Псевдонимы не принимают аргументов.Происходит следующее: $@
расширяется до ничего , когда вы определяете псевдоним, поэтому он ведет себя точно так же, как alias cmd1='VAR=setting1 cmd '
.«Аргументы» просто добавляются к расширению псевдонима.
Вместо этого определяются функции:
cmd1 () {
VAR=setting1 cmd "$@"
}
cmd2 () {
VAR=setting2 cmd "$@"
}
Далее, расширение псевдонима происходит за до расширения параметра, что объясняетошибка, которую вы видите.Как только $cmd
расширяется до cmd1
, bash
не пытается расширить cmd1
как псевдоним;он просто обрабатывает его как имя команды, которую не может найти.Поиск функций происходит после применения всех расширений, поэтому ваш цикл
CMDs='cmd1 cmd2'
source ~/.bash_aliases
for cmd in CMDs ; do
"$cmd" list
done
теперь будет работать.cmd1
является функцией и выполняется с list
в качестве аргумента.(Возможно, вы захотите сохранить функции в файле с другим именем, но это не имеет большого значения. Несмотря на название, .bash_aliases
должен быть только действительным сценарием, а не просто набором псевдонимов.)