为什么我的脚本在 Linux 上似乎可以工作,但在 FreeBSD 上却不起作用?就好像 FreeBSD 忽略了“if”

Fla*_*ler 2 bash freebsd sh

我正在尝试编写一个便携式安装脚本来为我的编程语言构建编译器。您可以在此处查看脚本:

mkdir ArithmeticExpressionCompiler
cd ArithmeticExpressionCompiler
if command -v wget &> /dev/null
then
  wget https://flatassembler.github.io/Duktape.zip
else
  curl -o Duktape.zip https://flatassembler.github.io/Duktape.zip
fi
unzip Duktape.zip
if command -v gcc &> /dev/null
then
  gcc -o aec aec.c duktape.c -lm # The linker that comes with recent versions of Debian Linux insists that "-lm" is put AFTER the source files, or else it outputs some confusing error message.
else
  clang -o aec aec.c duktape.c -lm
fi
./aec analogClock.aec
if command -v gcc &> /dev/null
then
  gcc -o analogClock analogClock.s -m32
else
  clang -o analogClock analogClock.s -m32
fi
./analogClock
        
Run Code Online (Sandbox Code Playgroud)

然而,当我在 FreeBSD 上运行它时,它抱怨wget找不到。但脚本wget在调用之前会检查是否存在。wget不应该在 FreeBSD 上调用。现在,我知道 FreeBSD 使用sh而不是bash,并且我想我的脚本实际上并不符合 POSIX 标准。那么,我做错了什么?

Max*_*ard 8

来自POSIX规范:

如果命令由控制运算符 ( '&' ) 终止,则 shell 应在子 shell 中异步执行该命令。这意味着 shell 在执行下一个命令之前不应等待命令完成。

在 posix 中,&>posix 不支持它,而是将其视为&后台命令指示器,导致您的命令与下一部分异步运行> /dev/null,下一部分被视为单独的命令。这基本上是如果你要运行:

command -v wget & > /dev/null
Run Code Online (Sandbox Code Playgroud)

相反,你必须以另一种方式重定向:

command -v wget >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)