我的 ~/.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 $?
如果你想通过管道传输任何文本输出,你需要 print
它在 func1
,而不是返回它:
func1 () { print 1 }
从 stdin 读取的方法有很多种,最短的是使用 $(<&0)
:
if [[ $(<&0) = 1 ]]
<&
从文件描述符编号读取,在本例中为 0
这是标准输入。
您还可以使用$(</dev/stdin)
从特殊的/dev/stdin 文件中读取,但我不确定它的可移植性如何。如果您只关心在 Linux 上运行,那么这是一种更具可读性的方法,但我不确定它在例如 Linux 上的运行情况如何。 macOS、BSD、Windows、illumos 等等(some background ,我还没有通读它)。
还有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!
一次。
关于zsh - 将函数输出通过管道传递到另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73374845/