Зацикливание на псевдонимах в Bash - PullRequest
0 голосов
/ 13 октября 2018

У меня есть пара aliases, определенных в ~/.bash_aliases.Они вызывают одну и ту же команду с разными настройками переменных среды, поэтому мне не нужно вводить их каждый раз.aliases отлично работает в интерактивных оболочках.

alias cmd1='VAR=setting1 cmd $@'
alias cmd2='VAR=setting2 cmd $@'

Теперь я хотел бы объединить все эти варианты команд, каждый с опцией «список».Для этого я настроил следующий скрипт в Bash:

#!/bin/bash
shopt -s expand_aliases
source ~/.bash_aliases
CMDs='cmd1 cmd2'
for cmd in CMDs ; do
    $cmd list
done

Однако этот скрипт выдает ошибку

"команда не найдена"

за каждый alias звонил.Я перепробовал всевозможные варианты, но не вижу, как здесь работают внутренние компоненты Bash.- Любые идеи приветствуются!

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вы можете использовать eval для этого:

#!/bin/bash
shopt -s expand_aliases
alias xxx="printf '%s\n'"
alias yyy="echo"
for cmd in xxx yyy
do
    eval $cmd foo bar bla
done

ВНИМАНИЕ eval зверь и довольно небезопасно.Обратитесь к Bash FAQ 048 за рекомендациями.

0 голосов
/ 13 октября 2018

Псевдонимы не принимают аргументов.Происходит следующее: $@ расширяется до ничего , когда вы определяете псевдоним, поэтому он ведет себя точно так же, как 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 должен быть только действительным сценарием, а не просто набором псевдонимов.)

...