使用 cat + 重定向模拟 tee

使用 cat + 重定向模拟 tee

我正在学习 bash 重定向,想知道是否有一种方法可以使用重定向来模拟 tee 命令。那可能吗?或者可能还有其他一些方法可以做到这一点。


在询问 tee 之前,我只是寻求一种使用 bash 表达式将一个流分成两个相同流的可能性。但这似乎是不可能的。

答案1

假设 Here 是一个与tee和具有相同功能的 bash 函数tee -a,假设该文件不包含¤¤¤¤¤¤¤¤¤¤!(您可以根据自己的喜好调整此字符串,以使文件极不可能包含它):

tee(){
  [ "$1" = '-a' ] && shift || rm -f "$1"
  sed 's/\x0/¤¤¤¤¤¤¤¤¤¤!/g' - | while read line; do
    echo "$line" | sed 's/¤¤¤¤¤¤¤¤¤¤!/\x0/g' >> "$1"
  done
}

使用 bash 和 zsh 进行测试。

使用示例:

echo asdf | tee -a file

答案2

你不能在 bash 中使用重定向来做到这一点,但你可以这样做:

$ cat file1
europe|EU
australia|AU
china|CN

$ cat file1 | { IFS=$'\n' read -r -d '' -a a; printf '%s\n' "${a[@]}"; printf '%s\n' "${a[@]}" >teetest; }
europe|EU
australia|AU
china|CN

$ cat teetest
europe|EU
australia|AU
china|CN

选择:

$ { IFS=$'\n' read -r -d '' -a a; printf '%s\n' "${a[@]}"; printf '%s\n' "${a[@]}" >teetest; } <file1

或者你可以构建一个函数:

$ function teetest { v="$(</dev/stdin)";printf '%s\n' "$v";printf '%s\n' "$v">teetest; }

$ cat file1 |teetest
europe|EU
australia|AU
china|CN

$ cat teetest
europe|EU
australia|AU
china|CN

答案3

zsh,是的,不与bash

zsh

cat file.in > file1.out > file2.out

甚至:

< file.in > file1.out > file2.out

或使用大括号扩展来生成输出文件:

< file.in > file{1..2}.out

(运行$NULLCMDcat默认)

请注意,它cat只有一个标准输出,用于写入内容file.in。上面,cat的标准输出是一个管道。并zsh从另一端读取输出并将其写入file1.outfile2.out

换句话说,那里没有魔法,zsh只是tee在内部实施。

相关内容