助け合いフォーラム
$ echo ping-t | tee | cat
正解
「ping-t」が表示される
解説
設問のコマンドは、「echo ping-t」によって「ping-t」という文字列が標準出力に出力されます。そのデータがパイプによってteeコマンドの標準入力に渡され、ファイルと標準出力に出力されます。その結果がさらにパイプでcatコマンドの標準入力に渡され、標準出力に出力されます。その結果、「ping-t」という文字列が標準出力(ディスプレイ)に出力されます。
なお、設問のコマンドではteeコマンドに引数としてファイル名が指定されていませんので、パイプで受け取ったデータは標準出力のみに出力されます。
よって正解は
・「ping-t」が表示される
です。
以下は実行例です。
$ echo ping-t | tee | cat
ping-t
その他の選択肢については、以下の通りです。
・「tee」が表示される
catにパイプで渡されるのはteeコマンドの標準出力です。teeコマンドは標準入力を指定されたファイルと標準出力に出力します。「tee」という文字列がcatの標準入力に渡されるわけではないので、誤りです。
・何も表示されない
・「echo ping-t | tee」が表示される
teeコマンドの標準出力である「ping-t」が表示されるので、誤りです。
・catコマンドの入力待ち状態になる
「ping-t」の出力後、catコマンドは終了しプロンプトに戻ります。catコマンドの入力待ち状態にはなりませんので、誤りです。
参考
catコマンドの書式と主なオプションは以下のとおりです。
cat [オプション] [ファイル名 ...]

catコマンドの引数にファイルを複数指定すると、ファイルを連結して出力します。ファイル名が指定されない場合、または「-(ハイフン)」が指定された場合は標準入力から受け取ったデータを標準出力に表示します。
以下は実行例です。
正解なのはわかるけど、仕様が知りたいです。
$ echo ping-t | tee | cat
ping-t
私の環境で試してみてもこうなるので、正解なのはわかっています。
ただ、私の理解度的にteeはディスプレイ(①)とファイル(②)が標準出力先になるという認識のため、
感覚的にはecho ping-t | teeこの時点で①の分の出力がディスプレイに表示され、通常ファイルに出力されるはずの②を受け取ったcatが
さらにping-tを表示し
$ echo ping-t | tee | cat
ping-t
ping-t
となりそうな気がしてしまいます。
と、ここまで書いて①もパイプでcatに流されている可能性を考えていなかったことに気づいたのですが、
そうだとしてもcatに2つ分のecho ping-tが行く気がして結局内部的にどうなっているのかよくわかりません。
それとも①が標準出力で、②は標準出力ではなく、私の知らない「○○出力」みたいなもので、
②はパイプで出力先を変更できず、ファイルの指定がなかった時点でどこかに消えていき、
①だけパイプでcatに送られて結果1つ分のping-tしか表示されないみたいな感じなのでしょうか?
どなたか浅学な私にご教示ください。
whatis teeでteeの動作を調べてみました。
tee (1) - read from standard input and write to standard output and files
標準入力を読んで、標準出力とファイルへ書き出すということみたいです。
tee | cat
teeからcatへ渡されるのは標準出力ですね。
そして、catが標準入力として受け取ったping-tを、標準出力としてディスプレイへ出力される。
teeはファイルへも書き出したいけど、ファイル名を書き出すファイルを指定していないので、捨てられるだけでしょう。
感覚的にはecho ping-t | teeこの時点で①の分の出力がディスプレイに表示され、通常ファイルに出力されるはずの②を受け取ったcatが
ファイルに出力される情報がcatへ渡る、と考えてますよね。
そこが勘違いの元かと。
echo ping-t | tee ping.txt | cat
と実行してもらえばご理解いただけるかも。
コメント
この投稿に対して返信しませんか?
t t-funaki
2025/04/28 10:39
ご返信ありがとうございます。 teeの挙動的に片方は標準出力として出力されて、片方はファイルに固定なのですね!そもそもの理解が誤っておりました。ありがとうございます。 ファイル名の記載がないと勝手に捨てられてしまうこともわかりました。