背景:我试图让 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/