Zsh环境下如何将func1的输出传递给func2?
问题分析与解决方法
首先明确两个核心问题:
func1里的return 1是设置函数的退出状态码,并非将内容输出到标准输出;而管道|的作用是传递前一个命令的标准输出,所以func1 | func2中,func2接收不到任何有效内容。func2是通过位置参数$1获取输入,而管道传递的内容会被送到后一个命令的标准输入,两者接收方式不匹配,这也是无输出的原因。
解决思路1:传递标准输出内容
如果目标是让func1把"1"作为内容传递给func2,可按以下方式调整:
方式A:修改func1输出内容,用xargs转成位置参数
先修改func1,让它把内容输出到标准输出:
func1 () { echo 1; }
然后用xargs将func1的标准输出转为func2的位置参数:
func1 | xargs func2
执行后就能触发func2输出foo。
方式B:修改func2读取标准输入
同样先修改func1输出内容:
func1 () { echo 1; }
再修改func2,让它读取标准输入的内容:
func2 () { local input read input # 读取标准输入的一行内容 if [ "$input" = 1 ]; then echo "foo"; fi }
此时直接执行func1 | func2即可输出foo。
解决思路2:传递退出状态码
如果初衷是传递func1的退出状态码(即return的1),无需使用管道,直接通过$?获取上一个命令的退出状态码并传给func2:
func1; func2 $?
$?会保存func1执行后的退出状态码(1),作为参数传给func2,同样能触发输出foo。
内容的提问来源于stack exchange,提问作者Josh Friedlander
相关产品推荐
相关产品推荐

