Por que um alias em um script sendo originado em um processo bash interativo não é expandido?

0
$ alias bb=hello

$ cat test.sh 
#! /bin/bash

alias bb
echo "$bb"

$ ./test.sh 
./test.sh: line 3: alias: bb: not found

É porque o alias não é herdado por um processo bash secundário para o script do processo bash pai?

$ source ./test.sh 
alias bb='hello'

O conteúdo do script é executado no processo bash, portanto, o alias existe. Mas o alias não é expandido.

O manual do Bash diz

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt

Mas o conteúdo do script que está sendo gerado é executado no processo bash interativo, então por que o alias não é expandido?

Obrigado.

    
por Tim 31.10.2018 / 14:07

2 respostas

4

Se você executar o script como

./test.sh

ele é executado em seu próprio shell não interativo, não no shell interativo atual. Você precisaria

. ./test.sh

que é equivalente ao

source ./test.sh

no seu segundo exemplo.

Veja Qual é a diferença entre o sourcing ('.' ou 'source') e a execução de um arquivo no bash?

Quanto a echo "$bb" , a expansão de parâmetro não expande aliases :

Aliases allow a string to be substituted for a word when it is used as the first word of a simple command.

    
por 31.10.2018 / 14:08
-3

Os scripts do shell são executados em um subcaminho (não no processo atual que imprime seu prompt).

Para tornar a execução de scripts de shell previsível, os aliases são limpos no sub-shell antes de executar esse script. Se isso não acontecesse, os scripts interpretariam alias desconhecidos e poderiam fazer qualquer coisa, dependendo de quais aliases estivessem ativos.

Aviso: Se você criar um script, isso afetará o shell principal, mas pelo menos os shells genéticos (shells que dependem da fonte histórica do Bourne Shell, por exemplo, ksh ou bosh ) analisarão os arquivos de script como um todo (como se todas as novas linhas tiverem sido substituídas por ponto e vírgula) antes de executar o código do script de origem. Isso faz com que as definições de alias de dentro de um script de origem não se tornem ativas no próprio script de origem.

    
por 31.10.2018 / 14:25

Tags