Bash如何不使用eval执行存储在变量中的多条命令
问题背景
你现有的wrapper.sh脚本逻辑如下:
#!/usr/bin/env bash node ./index.js $1
传入带&的参数时,&会被识别为参数的一部分,无法触发后续命令单独执行,且你不想使用eval、bash -c方案(担心命令异步执行不等待),也没有权限对wrapper.sh做大幅修改。
可行解决方案
方案1:允许微调脚本时优先使用(无eval、全同步执行)
仅需修改wrapper.sh的执行逻辑,无需调整入参格式:
#!/usr/bin/env bash # 按&拆分输入的第一个参数 IFS='&' read -ra input_parts <<< "$1" # 第一部分传给node进程 node ./index.js "${input_parts[0]}" # 后续部分依次作为独立命令执行,自动等待每条命令完成 for ((idx=1; idx<${#input_parts[@]}; idx++)); do ${input_parts[$idx]} done
调用方式和之前完全一致:
./wrapper.sh "hello&pwd"
执行时会先运行node ./index.js hello并等待执行完成,再运行pwd并等待完成,完全符合预期。
方案2:完全无法修改脚本时的调用端适配方案
如果wrapper.sh的内容完全不能调整,可以直接修改调用参数的写法,去掉外层引号,把多个命令用;分隔即可:
./wrapper.sh hello;pwd
shell会先执行./wrapper.sh hello并等待完成,再执行pwd,也能满足需求。
补充:eval方案的等待问题修复
如果你后续可以接受使用eval,只需加wait即可解决不等待的问题:
#!/usr/bin/env bash eval "$1" wait
所有后台执行的命令都会被等待完成后脚本才会退出。
内容的提问来源于stack exchange,提问作者Shubham Kumar
相关产品推荐
相关产品推荐

