Eu tenho o seguinte script:
#!/bin/bash
set -x
if :; then
echo a
fi
Se eu corro bash /tmp/file
, a
é ecoado, mas se eu corro source /tmp/file
, recebo:
bash: /tmp/test: line 6: syntax error: unexpected end of file
A saída:
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
Saída de comandos shopt -p
e set -o
: http://pastebin.com/bsqc8aru
Saída de set
: http://pastebin.com/S9KpqZAL
declare -fp
não produz nada.
Eu pensei que source
faz o mesmo que bash
, mas, em vez de iniciar uma nova sessão, executa o código na atual. Alguém pode me explicar esse erro?
Executo o bash GNU bash, versão 4.2.53 (1) -release (x86_64-redhat-linux-gnu).
bash
shell-script
knezi
fonte
fonte
$BASH_ENV
conjunto?bash -c
a sua pergunta. Em seguida, mostre-nos o conteúdo do seu~/.bashrc
arquivo, provavelmente há algo que está estragando tudo.Respostas:
Posso reproduzir o seu comportamento se eu alias
fi
:Ele funciona quando você o executa, mas falha quando o origina, porque os aliases não estão disponíveis em shells não interativos (o tipo de shell que executa scripts de shell). Conforme explicado no manual do bash :
No entanto, quando você
source
algo, ele é executado em seu shell atual que, por ser interativo, já carregou os aliases e, portanto, ofi
alias é reconhecido e interrompe o fornecimento.fonte
alias
agora! :)set
foi descartado pela saída ealias if='foo "'
(uma citação aberta à direita deu um erro sobre a citação ausente, e, portanto, a última opção foi alias)fi
.