除了 shebang 之外,还可以设置解释器吗?

除了 shebang 之外,还可以设置解释器吗?

我正在运行一个脚本(在 tmuxinator 中),尝试获取另一个脚本(rvm)。 rvm 明确不允许从 sh 采购。我认为这不会成为问题,因为 tmuxinator 脚本中的 shebang 是

#!/bin/bash

但是当我插入 rvm 人员建议的代码以从脚本获取 rvm 时,

if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
  source "$HOME/.rvm/scripts/rvm"
fi

-我明白了

sh: 6: [[: not found

为什么在那里使用 sh 作为解释器?我还使用过 #!/usr/bin/zsh (这是我调用脚本的交互式 shell 中 $SHELL 的值)和 #!/usr/bin/env zsh,但它们给出了相同的抱怨。

答案1

RVM 是否在 /bin/sh 上下文中运行?这可能是您遇到此困难的原因;源脚本继承父级的解释器。看:http://ss64.com/bash/source.html

。 (源或点运算符)

从文件名参数中读取并执行命令当前 shell 上下文

(强调我的)

答案2

看来问题是从 Ruby 调用脚本的

exec(script)

并且 exec 始终在 /bin/sh 上下文中运行,显然不管被调用脚本中的 shebang 行如何。

更改为

exec('/bin/bash', '-c', script)

作品。

相关内容