Si "golpear" funciona, ¿por qué es "fuente" arrojando un error?

Si "golpear" funciona, ¿por qué es "fuente" arrojando un error?

Tengo el siguiente script:

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

Si ejecuto bash /tmp/file, ase repite, pero si ejecuto source /tmp/file, obtengo:

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

La salida:

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

Salida de comandos shopt -py set -o:http://pastebin.com/bsqc8aru

Salida de set:http://pastebin.com/S9KpqZAL

declare -fpno produce nada.

Pensé que sourcehacía lo mismo que bash, pero en lugar de iniciar una nueva sesión, ejecuta el código en la actual. ¿Alguien puede explicarme este error?

Ejecuto bash GNU bash, versión 4.2.53(1) (x86_64-redhat-linux-gnu).

Respuesta1

Puedo reproducir tu comportamiento si tengo un alias fi:

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

Funciona cuando lo ejecuta, pero falla cuando lo obtiene porque los alias no están disponibles en shells no interactivos (el tipo de shell que ejecuta scripts de shell). Como se explica enel manual de bash:

Los alias no se expanden cuando el shell no es interactivo, a menos que la expand_aliasesopción del shell esté configurada usando shopt(verLa tienda incorporada).

Sin embargo, cuando hace sourcealgo, se ejecuta en su shell actual que, debido a que es interactivo, ya ha cargado los alias y, por lo tanto, el fialias se reconoce y rompe el origen.

información relacionada