为什么这个 bash 脚本在 Ubuntu 上会出错,但在 OSX 上却不会

为什么这个 bash 脚本在 Ubuntu 上会出错,但在 OSX 上却不会
#!/usr/bin/env sh
export $NODE_CONFIG_DIR=/Users/full/path/to/script/config
cd /Users/full/path/to/script
/usr/local/bin/node main

该脚本在 OSX 上本地运行(如果我调整本地环境的路径),但在 Ubuntu 上我得到:

./mtf_runner.sh: 2: export: : bad variable name

我想使用 cron 运行脚本并需要设置NODE_CONFIG_DIR环境变量

此外,尽管该命令在 OSX (10.8.5) 上运行cron,但我确实收到了发送到我本地邮件的以下内容:

line 2: export: `=/Users/myname/Node/Development/tennistracker/config': not a valid identifier

我读到过,这可能是由周围的空格引起的=,但肯定没有空格

答案1

这是因为在设置变量时,不应在其前面加上 $。此处,在运行该行之前,$NODE_CONFIG_DIR 被扩展为空(因为未设置),这导致您运行export =/Users/full/path/to/script/config。该脚本应为

#!/usr/bin/env sh
export NODE_CONFIG_DIR=/Users/full/path/to/script/config
cd /Users/full/path/to/script
/usr/local/bin/node main

答案2

虽然避免使用“$”作为变量前缀的做法是正确的,但还有另一个区别。在 OSX 系统上,“sh”是“bash”。也就是说,它是一个 Bourne 类型的 shell。在 Mac 上,只需执行以下命令即可验证这一点

man sh

在 Ubuntu 上,“sh” 是“dash”。Dash 是 Korn 类型的 shell。您也可以通过“man”页面或执行以下操作来查看它:

ls -al /bin/sh

因此,如果您想确保您的脚本在两个系统上运行相同,请执行以下操作:

#!/usr/bin/env bash

而不是正常的‘sh’。

相关内容