J'ai le script suivant:
#!/bin/bash
set -x
if :; then
echo a
fi
Si je cours bash /tmp/file
, a
est répercuté, mais si je cours source /tmp/file
, j'obtiens:
bash: /tmp/test: line 6: syntax error: unexpected end of file
Le résultat:
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
Sortie des commandes shopt -p
et set -o
: http://pastebin.com/bsqc8aru
Sortie de set
: http://pastebin.com/S9KpqZAL
declare -fp
ne produit rien.
Je pensais que cela source
faisait la même chose que bash
, mais au lieu de démarrer une nouvelle session, le code était plutôt exécuté dans la session actuelle. Quelqu'un peut-il m'expliquer cette erreur?
Je lance bash GNU bash, version 4.2.53 (1) -release (x86_64-redhat-linux-gnu).
bash
shell-script
knezi
la source
la source
$BASH_ENV
ensemble?bash -c
votre question. Ensuite, montrez-nous le contenu de votre~/.bashrc
fichier, il y a probablement quelque chose qui fout les choses.Réponses:
Je peux reproduire votre comportement si je alias
fi
:Il fonctionne lorsque vous l'exécutez mais échoue lorsque vous le sourcez car les alias ne sont pas disponibles dans les shells non interactifs (le type de shell qui exécute les scripts shell). Comme expliqué dans le manuel bash :
Cependant, lorsque vous
source
quelque chose, il est exécuté dans votre shell actuel qui, car il est interactif, a déjà chargé les alias et donc l'fi
alias est reconnu et rompt le sourcing.la source
alias
maintenant! :)set
était exclu par la sortie etalias if='foo "'
(une citation ouverte de fin donnait une erreur sur la citation manquante, et donc la dernière option était l'aliasingfi
.