Mam następujący skrypt:
#!/bin/bash
set -x
if :; then
echo a
fi
Jeśli uruchomię bash /tmp/file
, a
zostanie powtórzone, ale jeśli uruchomię source /tmp/file
, otrzymam:
bash: /tmp/test: line 6: syntax error: unexpected end of file
Wyjście:
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
Wyjście poleceń shopt -p
i set -o
: http://pastebin.com/bsqc8aru
Wyjście set
: http://pastebin.com/S9KpqZAL
declare -fp
nie produkuje nic.
Myślałem, że source
robi to tak samo bash
, ale zamiast uruchamiać nową sesję, raczej uruchamia kod w bieżącej. Czy ktoś może mi wyjaśnić ten błąd?
Uruchamiam bash GNU bash, wersja 4.2.53 (1) -release (x86_64-redhat-linux-gnu).
bash
shell-script
knezi
źródło
źródło
$BASH_ENV
zestaw?bash -c
Twoim pytaniem. Następnie pokaż nam zawartość~/.bashrc
pliku, prawdopodobnie coś tam psuje.Odpowiedzi:
Mogę odtworzyć twoje zachowanie, jeśli
fi
:Działa, gdy go uruchomisz, ale zawiedzie, gdy go źródlesz, ponieważ aliasy nie są dostępne w nieinteraktywnych powłokach (rodzaj powłoki, która uruchamia skrypty powłoki). Jak wyjaśniono w podręczniku bash :
Jednak gdy
source
coś zrobisz , zostanie uruchomione w bieżącej powłoce, która, ponieważ jest interaktywna, już załadowała aliasy, a zatemfi
alias jest rozpoznawany i przerywa pozyskiwanie.źródło
alias
teraz! :)set
zostało wykluczone przez dane wyjściowe, ialias if='foo "'
(końcowy cytat otworzył błąd dotyczący brakującego cytatu, więc ostatnia opcja była aliasingfi
.