Tengo el siguiente script:
#!/bin/bash
set -x
if :; then
echo a
fi
Si ejecuto bash /tmp/file
, a
se 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 -p
y set -o
:http://pastebin.com/bsqc8aru
Salida de set
:http://pastebin.com/S9KpqZAL
declare -fp
no produce nada.
Pensé que source
hací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_aliases
opción del shell esté configurada usandoshopt
(verLa tienda incorporada).
Sin embargo, cuando hace source
algo, se ejecuta en su shell actual que, debido a que es interactivo, ya ha cargado los alias y, por lo tanto, el fi
alias se reconoce y rompe el origen.