Eu quero executar um alias dentro de uma bash -c
construção.
O bash
manual diz:
Os aliases não são expandidos quando o shell não é interativo, a menos que a
expand_aliases
opção shell seja definida usandoshopt
Neste exemplo, por que o alias hi
não é encontrado ao definir expand_aliases
explicitamente?
% 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
estou correndo GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
.
Contexto: Eu quero ser capaz de executar um alias com prioridade ociosa, por exemplo, um script contendo:
#!/bin/bash
exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s expand_aliases; $(shell-quote "$@")"
Eu quero evitar usar bash -i
porque eu não quero que o meu .bashrc
seja lido.
Não parece funcionar se você definir o alias na mesma linha em que é usado. Provavelmente algo a ver com a forma como os aliases são expandidos muito cedo no processamento da linha de comando, antes do estágio de análise real. Em um shell interativo:
Observe como o alias usado está uma linha atrasado: no segundo comando ele não encontra o alias que acabou de definir, e no terceiro comando ele usa o que foi definido anteriormente.
Então, funciona se colocarmos uma nova linha dentro da
-c
string:(Você também pode usar
bash -O expand_aliases -c ...
em vez de usarshopt
dentro do script, não que isso ajude com a nova linha.)Alternativamente, você pode usar uma função shell em vez de um alias, eles também são muito melhores de outras maneiras:
Transformando meu comentário em uma resposta, como sugerido por ilkkachu.
O manual do Bash (vinculado na pergunta) fornece uma explicação de como os aliases são tratados quando há uma definição de alias e um comando na mesma linha.
Citação (ligeiramente formatada para maior clareza):
A resposta de ilkkachu fornece várias soluções possíveis para esse problema.