我正在学习 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
(运行$NULLCMD
:cat
默认)
请注意,它cat
只有一个标准输出,用于写入内容file.in
。上面,cat
的标准输出是一个管道。并zsh
从另一端读取输出并将其写入file1.out
和file2.out
。
换句话说,那里没有魔法,zsh
只是tee
在内部实施。