私はbashリダイレクトを学んでいますが、リダイレクトを使用してteeコマンドをエミュレートする方法があるかどうか疑問に思います。それは可能ですか?または他の方法があるかもしれません。
teeについて質問する前に、私はbash式を使用してストリームを2つの同じストリームに分割する可能性を探していました。しかし、これは不可能に見えます。
答え1
以下は、ファイルにファイルが含まれていないと仮定し、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
1つだけですfile.in
。上記ではcat
、標準出力はパイプです。そしてzsh
もう一方の端の出力を読み、それをfile1.out
sumに書き込みますfile2.out
。
つまり、そこには魔法がなく、ただ内部的に実装されただけzsh
ですtee
。