当我在 macOS (Sonoma 14.4.1) 上的 bash shell 中
source
执行以下简单脚本时,我得到
“语法错误:意外的文件结尾”。
#!/bin/bash
echo "Hello"
echo "$SHELL"
if [[ -n "foobar" ]]; then
echo "Ok"
fi
echo "Bye"
如果我删除
if
语句(第 4-6 行),它的行为将按预期进行。在 Linux (CentOS 7) 上,它(使用 if
语句)生成带有“Ok”的预期输出。
我正在使用 Unix 行结尾 (LF)。
macOS 结果:
$ source bash-if-trouble.sh
Hello
/bin/bash
-bash: bash-if-trouble.sh: line 10: syntax error: unexpected end of file
预期和 CentOS7 结果:
Hello
/bin/bash
Ok
Bye
我可以在以下情况下重现该问题:
在
$HOME/bin
(在我的PATH
上)中,有一个名为bash61.sh
的脚本(只需可读而不可执行),其中包含echo "Syntax error"
。
在
$HOME/soq
中,有一个不可执行的脚本bash61.sh
,其中包含您的(有效)代码。
由于我的正常外壳是
zsh
,因此在$HOME/soq
中,我运行:
SHELL=/bin/bash bash -c 'source bash61.sh'
输出为
Syntax error
,表明 $PATH
上的脚本优先于当前目录中的脚本。
执行此操作:
SHELL=/bin/bash bash -c 'source ./bash61.sh'
产品:
Hello
/bin/bash
Ok
Bye
换句话说,让您感到沮丧的原因是您认为源自当前目录的脚本实际上源自 PATH 中的其他位置。
我的
.
开头有 PATH
(无论好坏),而 $HOME/bin
实际上是第三个目录,因此源脚本的选择并不完全明显。在我在 $HOME/bin
中创建脚本之前,source bash61.sh
和 source ./bash61.sh
都成功运行了您的代码。
在运行 macOS Sonoma 14.4.1 的 M2 MacBook Pro 上进行测试。