为什么这个bash脚本会在Ubuntu上给出错误而不是OSX


1
#!/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环境变量

此外,虽然该命令在cronOSX(10.8.5)上运行,但我确实将以下内容发送到我的本地邮件:

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

我已经读到这可能是由周围的空间引起的,=但绝对没有空间


指定#!/usr/bin/env sh为脚本解释器的脚本不是bash脚本不是在Ubuntu上不在Debian上,而不是在NetBSD上
JdeBP 2014年

Answers:


4

这是因为在设置变量时,不应该在$前面添加前缀。在这里,$ 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

0

虽然避免使用“$”作为变量前缀是正确的,但还有另一个区别。在OSX系统上,'sh'是'bash'。也就是说,它是一个Bourne类型的shell。这可以通过简单地在Mac上验证

man sh

在Ubuntu上,'sh'是'破折号'。Dash是一个Korn型shell。您也可以通过“人”页面或通过以下方式查看:

ls -al /bin/sh

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

#!/usr/bin/env bash

而不是正常的'sh'。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.