Eu ficaria surpreso se for um verdadeiro Bourne shell no Linux. Embora o shell Bourne tenha sido portado para o Linux, ele geralmente não é instalado nem empacotado por padrão.
Você só o instalaria para fins de arqueologia.
Talvez você esteja confundindo sh
(que hoje em dia se refere a um intérprete ou outro da linguagem POSIX sh
) com o shell Bourne (um shell antigo que também costumava ser chamado de sh
(e do qual sh
s descende, mas também difere)).
O shell Bourne não possui aliases. Modern sh
do.
Os aliases, no entanto, são locais para o shell atual. Se você executar um novo shell (seja bash
, sh
, csh
, zsh
...), esse novo shell não herdará esses aliases.
Você precisaria redefinir esses aliases no novo shell.
bash
tem uma maneira de despejar a definição de um de seus alias em uma sintaxe compatível com a de sh
. Então você poderia fazer:
alias foo='echo foo' # alias defined in bash
foo_definition=$(alias foo)
sh -c "$foo_definition
foo"
Ou simplesmente:
sh -c "$(alias foo)
foo"
Agora, há um problema que não funciona em todas as implementações de sh
. Primeiro você notou que não fizemos:
sh -c "$(alias foo);foo"
O que teria funcionado em não sh
implementação.
Isso porque os aliases são realmente como alguma forma de expansão de macro. Como a expansão de alias é feita antes da análise, em alias foo='echo foo'; foo
, no momento em que o comando alias
é executado, a linha já foi analisada.
Colocar a definição de alias em uma linha e seu uso nas próximas obras para alguns shells, mas alguns outros (como yash
ou zsh
) analisam todo o código sh -c
como um todo, portanto expansão de alias não vai funcionar lá.
No entanto, como os aliases são mais ou menos macros, ou seja, a substituição de algum texto por outro texto, é melhor fazer a substituição manualmente.
Você pode obter o valor de um alias fazendo:
eval "$(alias foo | sed '1s/ /_/')"
Que armazenaria a definição do foo
alias na variável $alias_foo
.
Então, você pode fazer:
sh -c "$alias_foo"
Para que o valor do foo
alias seja passado como código shell para sh
.
Você pode preferir usar funções de aliases para essa finalidade. Como para aliases, as funções são locais para o shell atual. Alguns shells como rc
ou bash
podem exportar funções para outras invocações do mesmo interpretador.
foo() { echo foo; }
export -f foo
sh -c foo
Funcionaria somente em sistemas em que sh
fosse implementado com bash
(principalmente apenas Apple OS / X e alguns sistemas baseados em Linux).
Uma abordagem mais portável seria para os aliases despejarem a definição da função no código passado para sh -c
:
sh -c "$(typeset -f foo); foo"
Desta vez, nenhum problema com o tempo de expansão, o tempo de análise como funções, em oposição a aliases como funções, são estruturas reais da linguagem.
No entanto, você precisa garantir que a definição da função contenha código com a sintaxe sh
válida e não use nenhuma extensão bash
.