如何将管道命令作为参数传入Bash脚本并执行?
问题解答
可以实现,但直接通过$CMD执行会无法正确解析管道符号,需要调整执行方式:
问题原因
当你执行parent-script.sh "child-script1.sh | child-script2.sh"时,带引号的参数会被shell当作单个完整字符串传入父脚本。如果父脚本仅执行$CMD,shell会尝试运行一个名为child-script1.sh | child-script2.sh的命令(把管道符号当作文件名的一部分),而不是将其解析为管道分隔的两个命令。
正确实现方式
在父脚本中使用eval命令重新解析字符串,让shell识别管道等特殊符号。示例父脚本:
#!/bin/bash CMD="$1" eval "$CMD"
运行parent-script.sh "child-script1.sh | child-script2.sh"后,eval会将字符串拆分为child-script1.sh和child-script2.sh,并通过管道执行两者。
注意事项
eval会执行字符串中的任意shell命令,若传入的参数来自不可信来源,可能存在安全风险(比如参数包含恶意命令会被直接执行),使用时需谨慎。
内容的提问来源于stack exchange,提问作者kolisko
相关产品推荐
相关产品推荐

