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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:15:00