Tengo el siguiente script:
#!/bin/bash
set -x
if :; then
echo a
fi
Si corro bash /tmp/file
, a
se repite, pero si corro 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
hace lo mismo que bash
, pero en lugar de comenzar 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) -release (x86_64-redhat-linux-gnu).
bash
shell-script
knezi
fuente
fuente
$BASH_ENV
conjunto?bash -c
su pregunta. Luego, muéstranos el contenido de tu~/.bashrc
archivo, probablemente hay algo allí que está arruinando las cosas.Respuestas:
Puedo reproducir tu comportamiento si alias
fi
: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 en el manual de bash :
Sin embargo, cuando
source
algo, se ejecuta en su shell actual que, debido a que es interactivo, ya ha cargado los alias y, por lo tanto, elfi
alias se reconoce y rompe el origen.fuente
alias
ahora! :)set
se descartó por la salida, yalias if='foo "'
(una cita abierta final dio un error sobre la cita faltante, por lo que la última opción fue el aliasfi
.