Se “bash file” funcionar, por que “arquivo de origem” está causando erro?

25

Eu tenho o seguinte script:

#!/bin/bash
set -x
if :; then
    echo a
fi

Se eu executar bash /tmp/file , a é ecoado, mas se eu executar source /tmp/file , obtenho:

bash: /tmp/test: line 6: syntax error: unexpected end of file

A saída:

knezi@holly tmp]$set -x; source /tmp/test; set +x
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$set -x; command source /tmp/test; set +x
+ set -x
+ command source /tmp/test
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$bash -c "source /tmp/test"
+ bash -c 'source /tmp/test'
++ :
++ echo a
a


knezi@holly tmp]$od -c /tmp/test
0000000   #   !   /   b   i   n   /   b   a   s   h  \n   s   e   t    
0000020   -   x  \n   i   f       :   ;       t   h   e   n  \n  \t   e
0000040   c   h   o       a  \n   f   i  \n
0000051

Saída dos comandos shopt -p e set -o : link

Saída de set : link

declare -fp não produz nada.

Eu achei que source faz o mesmo que bash , mas em vez de iniciar uma nova sessão, ele executa o código no atual. Alguém pode me explicar esse erro?

Eu corro o bash GNU bash, versão 4.2.53 (1) -release (x86_64-redhat-linux-gnu).

    
por knezi 20.06.2016 / 11:45

1 resposta

73

Eu posso reproduzir seu comportamento se eu alias fi :

$ alias fi=:
+ alias fi=:
$ . ./test
+ . ./test
++ set -x
bash: ./test: line 6: syntax error: unexpected end of file

Funciona quando você o executa, mas falha quando você o obtém porque os aliases não estão disponíveis em shells não interativos (o tipo de shell que executa scripts de shell). Conforme explicado no manual do bash :

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see The Shopt Builtin).

No entanto, quando você é source something, ele é executado no shell atual, que, por ser interativo, já carregou os aliases e, portanto, o fi alias é reconhecido e interrompe a origem.

    
por 20.06.2016 / 13:08