У меня есть следующий скрипт:
#!/bin/bash
set -x
if :; then
echo a
fi
Если я бегу bash /tmp/file
, a
повторяется, но если я бегу source /tmp/file
, я получаю:
bash: /tmp/test: line 6: syntax error: unexpected end of file
Выход:
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
Вывод команд shopt -p
и set -o
: http://pastebin.com/bsqc8aru
Вывод set
: http://pastebin.com/S9KpqZAL
declare -fp
ничего не производит.
Я думал, что source
делает то же самое bash
, но вместо запуска нового сеанса скорее запускает код в текущем. Может кто-нибудь объяснить мне эту ошибку?
Я запускаю bash GNU bash, версия 4.2.53 (1) -релиз (x86_64-redhat-linux-gnu).
bash
shell-script
knezi
источник
источник
$BASH_ENV
набор?bash -c
вашим вопросом. Затем покажите нам содержимое вашего~/.bashrc
файла, там, вероятно, что-то напортачило.Ответы:
Я могу воспроизвести ваше поведение, если я псевдоним
fi
:Он работает, когда вы его выполняете, но не работает, когда вы его создаете, потому что псевдонимы недоступны в неинтерактивных оболочках (тип оболочки, которая запускает сценарии оболочки). Как объяснено в руководстве по bash :
Однако, когда вы
source
что-то делаете , он запускается в вашей текущей оболочке, которая, поскольку она является интерактивной, уже загрузила псевдонимы и, следовательно,fi
псевдоним распознается и прерывает получение.источник
alias
сейчас! :)set
было исключено выходными данными , иalias if='foo "'
(конечная открытая кавычка выдавала ошибку об отсутствующей кавычке, и поэтому последний вариант был псевдонимомfi
.