管道功能输出到另一个功能



我的~/.zshrc 中有以下两个函数

func1 () {return 1}
func2 () {if [ "$1" = 1 ]; then echo "foo"; fi }

调用func2 1打印foo。调用func1 | func2不会打印任何内容。

如何将func1的输出传递给func2

return 1实际上并没有打印任何内容供func2读取,它只是为该函数设置退出代码。您可以使用$?$status变量来检查最后一个命令的退出代码(它们是相同的(:

func1; func2 $?

如果您想通过管道传输任何文本输出,您需要在func1print它,而不是返回它:

func1 () { print 1 }

从stdin读取有很多方法,最短的是使用$(<&0):

if [[ $(<&0) = 1 ]]

<&从文件描述符编号中读取,在本例中为0,它是stdin。

你也可以使用$(</dev/stdin)从特殊的/dev/stdin文件中读取,但我不确定它的可移植性。如果你只关心在Linux上运行,那么这是一种更可读的方法,但我也不确定它在macOS、BSD、Windows、illumos或其他什么上的工作效果如何(一些背景知识,我还没有通读过(。

还有read(它有很多你在这里不需要的选项,但知道它的存在很有用(:

read in
if [[ $in = 1 ]]

甚至只是cat,它默认情况下像大多数工具一样从stdin读取:

if [[ $(cat) = 1 ]]

在这种情况下,这有点傻,但如果您想过滤或更改行,那么像这样使用grephead会更有用。

综合起来:

func1() {
print '1'
}
func2() {
if [[ $(<&0) = 1 ]]; then
print 'One!'
fi
}
func1 | func2
print 2 | func2

将打印One!一次。

相关内容

最新更新