You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Shebang使用环境变量指定resty执行路径?

解决Shebang中使用环境变量的问题

问题原因

/usr/bin/env 不会调用Shell解析变量,你写的 ${CURR_RESTY_PATH} 会被它当成字面量文件名,自然找不到对应的程序,所以报错。

解决方案:用Shell脚本作为包装层

把原来的kong文件改成Shell脚本,让Shell先解析环境变量,再调用resty执行Lua代码。修改后的文件内容如下:

#!/bin/sh
# 使用环境变量指定的resty路径,未设置则用默认值
exec "${CURR_RESTY_PATH:-/usr/local/openresty/bin/resty}" -- "$0" "$@"
# 以下是原Lua代码,resty会自动跳过前面的Shell代码执行这里
setmetatable(_G, nil)
pcall(require, "luarocks.loader")

package.path = "./?.lua;./?/init.lua;" .. package.path

require("kong.cmd.init")(arg)

说明

  1. #!/bin/sh:指定用Shell解释器执行脚本开头部分
  2. exec "${CURR_RESTY_PATH:-/usr/local/openresty/bin/resty}" -- "$0" "$@"
    • ${CURR_RESTY_PATH:-默认路径}:Shell的默认值语法,如果环境变量未设置,自动使用后面的默认路径
    • --:告诉resty后面的参数是脚本路径和执行参数,避免参数解析冲突
    • $0:传递当前脚本的路径给resty
    • $@:传递所有命令行参数给resty
    • exec:让resty直接替换当前Shell进程,避免多余进程开销
  3. 后面的Lua代码会被resty正常执行,因为resty作为Lua解释器,会跳过开头的Shell代码(直到遇到Lua可识别的代码)

另一种拆分文件的方案

如果不想把Shell和Lua代码混在一起,可以拆分两个文件:

  1. 保留原Lua文件(比如命名为kong.lua)
  2. 新建kong Shell脚本:
#!/bin/sh
exec "${CURR_RESTY_PATH:-/usr/local/openresty/bin/resty}" /path/to/kong.lua "$@"

给kong脚本添加执行权限:chmod +x kong,执行时直接运行kong start即可。

内容的提问来源于stack exchange,提问作者Yongqi Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:17:30