如何在Bash中展开含管道的字符串以执行对应命令?
如何正确执行存储在变量中的带管道命令
问题原因
你遇到的核心问题是Bash的变量展开逻辑:直接使用$cmd时,Shell仅会完成分词和路径扩展,不会解析字符串中的Shell元字符(比如管道|)。所以echo hi | wc里的|和wc都被当成了echo的参数,最终执行的是echo hi '|' wc,自然只会输出hi | wc。
解决方案
方法1:用eval命令解析执行
eval会让Shell重新对展开后的字符串进行完整语法解析,包括识别管道这类元字符。直接运行:
eval "$cmd"
这样Shell就会正确把|当成管道,执行echo hi并将输出传给wc,得到预期的字符数结果。
⚠️ 注意:eval存在安全风险,如果cmd变量包含不可信内容(比如用户输入的恶意代码),可能会执行危险操作,仅在你完全可控变量内容的场景下使用。
方法2:用函数替代变量(更推荐)
如果是在脚本里使用,更安全可靠的方式是定义函数,而非把命令存在字符串变量里:
cmd() { echo hi | wc }
之后直接调用函数名即可执行命令:
cmd
函数的方式避免了字符串解析的问题,更易维护扩展,安全性也更高。
内容的提问来源于stack exchange,提问作者Mark VY
相关产品推荐
相关产品推荐

