我的~/.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 $?
如果您想通过管道传输任何文本输出,您需要在func1
中print
它,而不是返回它:
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 ]]
在这种情况下,这有点傻,但如果您想过滤或更改行,那么像这样使用grep
或head
会更有用。
综合起来:
func1() {
print '1'
}
func2() {
if [[ $(<&0) = 1 ]]; then
print 'One!'
fi
}
func1 | func2
print 2 | func2
将打印One!
一次。