为何`xargs bash -vc "$(declare -f {})"`命令无法正常工作?
问题:为何OSX Bash 3.2.57中步骤3的命令无输出?
运行环境
OSX系统下的Bash 3.2.57
测试步骤及现象
- 执行
declare -f my_bash_function可正常显示函数定义。 - 执行
bash -vc "$(declare -f my_bash_function)"可正常工作(需带-v参数)。 - 执行
echo "my_bash_function" | xargs -I{} bash -vc "$(declare -f {})"无任何输出,不符合预期。 - 若将占位符替换为函数名,执行
echo "my_bash_function" | xargs -I{} bash -vc "$(declare -f my_bash_function)"可正常工作。 - 使用单引号时,即使函数不存在也仅显示命令本身,说明未执行或求值:
执行echo "my_bash_function" | xargs -I{} bash -vc '$(declare -f {})'后输出:$(declare -f my_bash_function) declare -f my_bash_function
原因解释
步骤3的核心问题是命令替换的执行时机不对:
- 当你写
"$(declare -f {})"时,这个命令替换是由**当前shell(不是xargs启动的bash子进程)**先执行的。这时候{}还只是xargs的占位符,不是实际的函数名,declare -f {}找不到对应的函数定义,输出为空字符串。 - 最终传给
bash -vc的就是空内容,bash执行空命令自然没有任何输出。
对比来看:
- 步骤4里,
$(declare -f my_bash_function)是当前shell直接针对真实函数名求值,能拿到完整的函数定义,传给子bash后就能正常执行。 - 步骤5用单引号包裹
$(declare -f {}),阻止了当前shell的命令替换,这段字符串原封不动传给子bash。子bash执行时会替换{}为函数名,但子bash进程里并没有定义这个函数,所以只会把命令本身打印出来,不会有函数定义的输出。
内容的提问来源于stack exchange,提问作者Hado99
相关产品推荐
相关产品推荐

