小编Rob*_*obo的帖子

带有 env shebang 的脚本在 Linux 上挂起

我们有一个看起来像这样的脚本:

#!/usr/bin/env node --unhandled-rejections=strict
console.log("Hi!");
Run Code Online (Sandbox Code Playgroud)

这在我的笔记本电脑 (OSX) 上运行良好,但当我们在 Linux 上运行它时,它就挂起了。使用 strace 我们可以看到它不断加载 libc 并执行

execve("./foo.sh", ["./foo.sh"], ["YARN_VERSION=1.22.4", "HOSTNAME=307d861c7c1a", "PWD=/", "HOME=/root", "NODE_VERSION=12.18.1", "TERM=xterm", "SHLVL=1", "PATH=/usr/local/sbin:/usr/local/"..., "_=/usr/bin/strace", "node --unhandled-rejections=stri"...]) = 0
Run Code Online (Sandbox Code Playgroud)

我们可以在这里看到 env 的参数被解释为环境变量。我们还知道“node --unhandled-rejections=strict”作为单个参数传入。

我们可以通过创建两个脚本来看到 OSX 中的差异。b1.sh:

args=("$@")
echo \"${args[0]}\" \"${args[1]}\" \"${args[2]}\"
Run Code Online (Sandbox Code Playgroud)

和 b2.sh

#!/usr/bin/env /tmp/b1.sh foo=bar
Run Code Online (Sandbox Code Playgroud)

当我们在 OSX 上运行 b2.sh 时,我们得到

"foo=bar" "./b2.sh" ""
Run Code Online (Sandbox Code Playgroud)

在 Linux 上它也会挂起。

很明显,在 Linux 和 OSX 中,传递给 env 的参数是不同的。在 OSX 中,“/tmp/b1.sh”和“foo=bar”是单独的参数。在 Linux 中,它们作为相同的参数传递。

但是为什么这会导致 env 一遍又一遍地执行相同的代码呢?

linux

8
推荐指数
2
解决办法
386
查看次数

标签 统计

linux ×1