Я хочу запустить псевдоним внутри bash -c
конструкции.
В bash
руководстве сказано:
Псевдонимы не раскрываются, когда оболочка не является интерактивной, если параметр
expand_aliases
оболочки не установлен с помощьюshopt
В этом примере почему псевдоним hi
не найден при expand_aliases
явной настройке ?
% bash -O expand_aliases -c "alias hi='echo hello'; alias; shopt expand_aliases; hi"
alias hi='echo hello'
expand_aliases on
bash: hi: command not found
Я бегу GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
.
Контекст: я хочу иметь возможность запускать псевдоним с приоритетом ожидания, например, скрипт, содержащий:
#!/bin/bash
exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s expand_aliases; $(shell-quote "$@")"
Я хочу избежать использования, bash -i
поскольку я не хочу, чтобы мои .bashrc
читали.
bash -c "hi () { echo hello; }; hi"
выходыhello
.zsh
: псевдонимы zsh не расширяются даже с опциейcomplete_aliases
Ответы:
Это не работает, если вы устанавливаете псевдоним в той же строке, что и используемый. Возможно, это связано с тем, как псевдонимы раскрываются на самом раннем этапе обработки командной строки, до фактического этапа синтаксического анализа. На интерактивной оболочке:
Обратите внимание, что псевдоним используется на одну строку позже: во второй команде он не находит только что установленный псевдоним, а в третьей команде он использует ранее установленный.
Итак, это работает, если мы поместим новую
-c
строку в строку:(Вы можете также использовать
bash -O expand_aliases -c ...
вместо использованияshopt
в скрипте, не то чтобы это помогло с новой строкой.)В качестве альтернативы, вы можете использовать функцию оболочки вместо псевдонима, они гораздо лучше и в других отношениях:
источник
Превращение моего комментария в ответ, как предложено ilkkachu.
В руководстве по Bash (связанному с вопросом) дается объяснение того, как обрабатываются псевдонимы, когда в одной строке есть определение псевдонима и команда.
Цитата (слегка отформатирована для ясности):
Ответ ilkkachu дает несколько возможных решений этой проблемы.
источник