Ответ 1
Вам нужно использовать одинарные кавычки ('
), чтобы предотвратить bash при расширении переменной при создании псевдонима:
$ alias foo='echo "$bar"'
$ bar="hello"
$ foo
hello
Я новичок в bash, и я хочу включить env для псевдонимов bash. Я хочу сделать что-то вроде следующего
alias foo="bar $(baz)"
Чтобы я мог сделать что-то вроде следующего
> baz=40
> foo
и foo будет расширяться до команды bar 40
. В настоящее время вышесказанное не работает, потому что $(baz) расширяется при создании псевдонима. Должен ли я обернуть это внутри функции или что-то еще?
Вам нужно использовать одинарные кавычки ('
), чтобы предотвратить bash при расширении переменной при создании псевдонима:
$ alias foo='echo "$bar"'
$ bar="hello"
$ foo
hello
Псевдонимы не имеют "среды". Псевдоним - это просто "тупая" замена текста. В вопросе переменная среды не используется - только переменная оболочки. Если вы хотите использовать среду, используйте функцию. В этом случае нет преимущества для алиаса над функцией.
$ 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, так что работа по назначению окружения будет еще более сложной. Я предлагаю не использовать их, если вы действительно не знаете, что делаете.