Ich habe das folgende Skript:
#!/bin/bash
set -x
if :; then
echo a
fi
Wenn ich renne bash /tmp/file
, a
wird es wiedergegeben, aber wenn ich renne source /tmp/file
, bekomme ich:
bash: /tmp/test: line 6: syntax error: unexpected end of file
Die Ausgabe:
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
Ausgabe von Befehlen shopt -p
und set -o
: http://pastebin.com/bsqc8aru
Ausgabe von set
: http://pastebin.com/S9KpqZAL
declare -fp
produziert nichts.
Ich dachte, das source
macht dasselbe wie bash
, aber anstatt eine neue Sitzung zu starten, wird der Code in der aktuellen ausgeführt. Kann mir jemand diesen Fehler erklären?
Ich starte bash GNU bash, Version 4.2.53 (1) -release (x86_64-redhat-linux-gnu).
bash
shell-script
knezi
quelle
quelle
$BASH_ENV
Set?bash -c
deiner Frage funktioniert . Dann zeigen Sie uns den Inhalt Ihrer~/.bashrc
Datei, da ist wahrscheinlich etwas, das die Dinge vermasselt.Antworten:
Ich kann Ihr Verhalten reproduzieren, wenn ich einen Alias habe
fi
:Es funktioniert, wenn Sie es ausführen, schlägt jedoch fehl, wenn Sie es als Quelle verwenden, da Aliase in nicht interaktiven Shells (dem Typ der Shell, die Shellskripts ausführt) nicht verfügbar sind. Wie im Bash-Handbuch erklärt :
Wenn Sie jedoch
source
etwas tun, wird es in Ihrer aktuellen Shell ausgeführt, die, da sie interaktiv ist, die Aliase bereits geladen hat und daher denfi
Alias erkennt und das Sourcing unterbricht.quelle
alias
jetzt los ! :)set
von der Ausgabe ausgeschlossen wurde undalias if='foo "'
(ein nachgestelltes offenes Zitat gab einen Fehler über das fehlende Zitat aus, und die letzte Option war Aliasingfi
.