ティーを使用することに意味はありますか?


47

システムファイルへのテキストの追加に関するほとんどすべての指示が、前述のテキストの使用追加fstab/etc/apt/sources.list.d/<name>.list含むのはなぜですか?tee echo

rootとして実行される次の例を取り上げます。

## 1
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee -a file1
## 2
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' >> file2

実行しdiff -u file1 file2ても何も返されません。実行md5sum file1 file2すると、チェックサムが同一であることが示され、元の質問に戻ります。

なぜ| tee <FILENAME>Ubuntuのドキュメント全体でこれほど普及しechoているのteeですか?


1
コマンドにsudoがありません。2間で異なる結果が表示されます;)
リンツウィンド14年

1
@Rinzwindこれらのコマンドをルートとして実行しています。
アレクセイマグラ14年

回答:


84

違いがあります:teeは出力を複製します:ファイルとディスプレイの両方に出力します。

しかし、もっとあります:

  • たとえば、2つのファイルに文字列を一度に書き込みたい場合、使用できるtee付きのコマンドは次のとおりです。

     echo "some text" | tee file1 > file2  
    
  • Teeを使用するときに、1つの問題を回避することもできます。通常の出力リダイレクト演算子は、STDOUTテキストを生成するコマンドの前にsudoを書き込むときにも、常にユーザー権限で実行されます。言い換えると、そのファイルへの書き込み権限がない場合、これは失敗します。

     sudo echo "something" > bar  
    

    しかし、ティーでは、すべてがうまくいきます:

    echo "something" | sudo tee bar  
    

このサイトからの2つの例。さらにいくつかあります。


あなたがすることができsudoずにtee- sudo sh -c 'echo SOMETHING > FILE'...;)
Wilf

7
@wilf yeah、しかし引用符を出力する必要があるとき"、物事は面倒になります
Braiam 14年

3
最初のケースでは、N個のファイルに書き込みたい場合、stdoutで乱雑になりたくない場合は、をecho "some text" | tee file1 file2 ... fileN追加> /dev/nullすることをお勧めします。
エルマーザンダー14年

ナイスワン@ElmarZander :)
リンツウィンド14年

13

tee標準入力ストリームを取得し、標準出力ストリームとファイルストリームの両方に書き込みます。覚えやすい場合は、コマンド名は配管のTスプリッターに由来します。コマンド名の由来について学んだ素晴らしいWikipediaの記事があります。

ここに画像の説明を入力してください ここに画像の説明を入力してください


11

まず第一に、teeそれ自体はテキストを追加しません>

それはtee -a、その補足であり、>>テキストを追加します。

すべてのシェルがこの>>機能をサポートしているとは思わないため、teeより一般的に使用されています。(単純な古いものだと考えてくださいsh)。Teeはコマンドですが、Teeは>>オペレーターです。

あなたは(私の個人的な好み)を使用する場合bash>および>>非常に良く/簡単です。

を使用teeすると、そのコマンドをsudoだけでsudoできるため、のようにステートメント全体をsudoする必要はありませんsudo sh -c "echo foo > bar"teeまた、出力を分割することもできます。もちろん、これはすべてで見ることができますman tee。主に個人的な好みです。

詳細については、こちらこちらをご覧ください。


5
「sudo JUST that command」に関する明確化。これが少し複雑だという人のために:のようなフォームを使用してsudo somecommand >> filea実行しsudo somecommand、次に呼び出しユーザーとして出力をに追加しますfilea。使用するとsudo sh -c "somecommand >> filea"動作しますが、ネストされた引用の悪夢を引き起こす可能性があります。呼び出しユーザーとしてsomecommand | sudo tee -a filea実行somecommandを使用し、出力をfileaルートとして追加します-これは通常、ユーザーが望んでいたものです。
ダラエル14年

@Darael投稿を編集しました。明確にしてくれてありがとう。
カズウルフ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.