zsh - 将函数输出通过管道传递到另一个函数

标签 zsh

我的 ~/.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 ]]

在这种情况下,这有点愚蠢,但如果您想过滤或更改行,请使用 grephead这样比较有用。

把它们放在一起:

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/

相关文章:

linux - 如何防止在 ZSH 中执行命令?

kubernetes - Powerlevel9k 中自定义提示元素的动态背景颜色

linux - ZSH 中的 Kill/Yank(剪切/粘贴)

vim Vundle 的 PluginInstall 与 Archlinux 中的fish 冲突

visual-studio-code - 为什么我的输出末尾有 % 符号?

unix - 为 nvim 创建符号链接(symbolic link)时出错

macos - if 中的 zsh 变量赋值

macos - Zsh 制表符补全 "cd .."

python - 尝试使用 python 脚本获取源时检测到不安全的依赖于完成的目录

macos - 安全 : SecKeychainSearchCopyNext Error - Unable to Install Delve on MacOS