cat + リダイレクトを使用したティーシミュレーション

cat + リダイレクトを使用したティーシミュレーション

私は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デフォルト)

コンテンツの作成に使用される標準出力はcat1つだけですfile.in。上記ではcat、標準出力はパイプです。そしてzshもう一方の端の出力を読み、それをfile1.outsumに書き込みますfile2.out

つまり、そこには魔法がなく、ただ内部的に実装されただけzshですtee

関連情報