如何让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)
说明
#!/bin/sh:指定用Shell解释器执行脚本开头部分exec "${CURR_RESTY_PATH:-/usr/local/openresty/bin/resty}" -- "$0" "$@"${CURR_RESTY_PATH:-默认路径}:Shell的默认值语法,如果环境变量未设置,自动使用后面的默认路径--:告诉resty后面的参数是脚本路径和执行参数,避免参数解析冲突$0:传递当前脚本的路径给resty$@:传递所有命令行参数给restyexec:让resty直接替换当前Shell进程,避免多余进程开销
- 后面的Lua代码会被
resty正常执行,因为resty作为Lua解释器,会跳过开头的Shell代码(直到遇到Lua可识别的代码)
另一种拆分文件的方案
如果不想把Shell和Lua代码混在一起,可以拆分两个文件:
- 保留原Lua文件(比如命名为
kong.lua) - 新建
kongShell脚本:
#!/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
相关产品推荐
相关产品推荐

