bash - 在非登录 shell 中执行的 shebang 中执行 bash 脚本的正确语法是什么

标签 bash shell nvm

背景:我试图让 nvm 通过节点脚本顶部的 shebang 在非登录 shell 中正确设置 node

login shell 中节点脚本的 shebang 是:

#!/usr/bin/env node   

这不适用于非登录 shell 所以我想做等同于:

#!/usr/bin/env [[ -s $HOME/.nvm/nvm.sh ]] && source "$HOME/.nvm/nvm.sh" && node

但我无法获得正确的语法(错误见下文)。我尝试了几种方法,包括引用脚本或尝试运行它 bash -c。但每次我都遇到解析错误。

完整的脚本是:

#!/usr/bin/env node

const semver = require('semver');
console.log("Hello World! You're using " + process.version)

错误:

在登录 shell 中(我不需要它的地方)

❯ bin/nodesample.js
env: [[: No such file or directory

在我想找到解决方案的非登录shell中

env: [[: No such file or directory

如果我尝试 #!/usr/bin/env "[[ -s $HOME/.nvm/nvm.sh ]] && source "$HOME/.nvm/nvm.sh"&& node"

env: "[[: No such file or directory

最佳答案

shebang 不太适合运行复杂的命令。它的工作只是告诉内核你想为脚本使用什么解释器。它不在您的 shell 中执行,因此像 [[&& 甚至 $parameter 这样的概念将不存在。在您的错误消息中,env 告诉您它需要一个可以在您的路径上找到的命令,而 [[ 是一个 bash 关键字,因此它不起作用。

如果您需要在运行命令之前进行一些设置,标准解决方案是包装脚本,如 Julien 所建议的。

#!/usr/bin/env bash
[[ -s $HOME/.nvm/nvm.sh ]] && source "$HOME/.nvm/nvm.sh" && node bin/nodesample.js

您甚至可以更进一步,安装一个包装器脚本,然后您可以在其他节点脚本的 shebang 行上使用它。

#!/usr/bin/env bash
# nodewrapper script - place in e.g. /bin
[[ -s $HOME/.nvm/nvm.sh ]] && source "$HOME/.nvm/nvm.sh" && exec node "${@}"
#!/bin/nodewrapper
const semver = require('semver');
console.log("Hello World! You're using " + process.version)

关于bash - 在非登录 shell 中执行的 shebang 中执行 bash 脚本的正确语法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73767096/

相关文章:

Bash - 如果存在,如何去除字符串中的第一个和最后一个斜杠?

linux - 从另一个文件中减去后打印一个选择列

linux - 在 UNIX/Linux Shell 中同时运行一系列命令的更好方法?

node.js - 如何使用 nvm 正确升级 Node

python - 我如何在 Python 中执行 comm Linux 命令

python - 在 Python 中使用 Bash 仅获取 IP 地址

node.js - 安装node和npm的问题

node.js - 如何在VS Code集成终端打开时自动激活特定 Node 版本?

bash - 在 Bash 中,我如何遍历包含字符串和多个空格的文件?

bash - 如何从字符串中删除空格?