Как включить переменную среды внутри псевдонима для bash?

Я новичок в bash, и я хочу включить env для псевдонимов bash. Я хочу сделать что-то вроде следующего

alias foo="bar $(baz)"

Чтобы я мог сделать что-то вроде следующего

> baz=40
> foo

и foo будет расширяться до команды bar 40. В настоящее время вышесказанное не работает, потому что $(baz) расширяется при создании псевдонима. Должен ли я обернуть это внутри функции или что-то еще?

Ответы

Ответ 1

Вам нужно использовать одинарные кавычки ('), чтобы предотвратить bash при расширении переменной при создании псевдонима:

$ alias foo='echo "$bar"'
$ bar="hello"
$ foo
hello

Ответ 2

Псевдонимы не имеют "среды". Псевдоним - это просто "тупая" замена текста. В вопросе переменная среды не используется - только переменная оболочки. Если вы хотите использовать среду, используйте функцию. В этом случае нет преимущества для алиаса над функцией.

$ alias foo='echo "$bar"'
$ bar=hi foo

Это не выводит результат, потому что среда, установленная для простой команды, не применяется к разложениям.

$ alias foo=$'eval \'echo "$bar"\''
$ bar=hi foo
hi

Если вместо этого была использована функция, проблема не возникла бы.

$ foo() { echo "$bar"; }
$ bar=hi foo
hi

Если вы сомневаетесь, всегда используйте функцию.

Edit

Технически, приведенное выше bash - только. Выполнение этого полностью переносимым способом практически невозможно.

В режиме тире, mksh, bash POSIX и других оболочках POSIX вы можете:

foo() { echo "$bar"; }
bar=hi command eval foo

Однако это не будет работать в ksh93 или zsh. (Я уже сообщал об ошибке для ksh93, но он никогда не может быть исправлен.) В mksh и ksh93 вам следует определить функции с помощью ключевого слова function, но это не POSIX. Я не знаю ни одного решения, которое будет работать везде.

Чтобы усугубить ситуацию, дополнительные добавления добавляются в POSIX 2008-TC1, так что работа по назначению окружения будет еще более сложной. Я предлагаю не использовать их, если вы действительно не знаете, что делаете.