bash:条件语句导致 macOS 上出现“意外的文件结尾”

问题描述 投票:0回答:1

当我在 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
bash macos syntax-error
1个回答
0
投票

我可以在以下情况下重现该问题:

  • $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 上进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.