質問
マニュアルには、ティーは「パイプ継手」ツールであると記載されています。事例 [1] 私を混乱させる:
1.場合
echo "foo bar" | sudo tee -a /path/to/some/file
2.場合
:w !sudo tee %
ケースから tee のロジックを理解するのは困難です。Tシャツはどのように機能しますか?
解決
tee
は通常、プログラムの出力を分割して、表示とファイルへの保存の両方ができるようにするために使用されます。このコマンドを使用すると、データが別のコマンドまたはプログラムによって変更される前に中間出力をキャプチャできます。tee コマンドは標準入力を読み取り、その内容を標準出力に書き込みます。同時に結果を指定されたファイルまたは変数にコピーします。
tee [OPTION]... [FILE]...
例えば
tee [ -a ] [ -i ]... [ File ]...
-a
出力をファイルに上書きするのではなく、ファイルの末尾に追加します。-i
割り込みを無視します。
と sudo
質問内の例をファイルに追加します
ls -l | sudo tee -a file.txt
他のヒント
tee
コマンド パイプラインを分割するために使用され、コマンドの出力をファイルに保存できるようになります。 そして それをパイプラインに沿って送ります。最初の例では次のように指定しました。
echo "foo bar" | sudo tee -a /path/to/some/file
「foo bar」は標準出力にエコーされます そして に追加 /path/to/some/file
. 。T 字管は、出力を他の 2 つのパイプに分割する、パイプ内の「T」ジョイントのようなものと考えてください。
tee
コピー stdin
に stdout
(のように cat
)、さらに指定されたファイルにすべてを書き込みます。このように使用すると、 sudo
これにより、情報を特権モードにプッシュし、同時に適切な情報がそこに送られたかどうかを監視できるようになります。
また、シェル内でリダイレクトが処理される方法により、ほぼ同等であることにも注意してください。
sudo echo "foo bar" > /path/to/some/file
リダイレクトは呼び出し側ユーザーによって行われるため、機能しません。 sudo
対象ユーザー。
事例の説明
1.sudo- および -tee コマンドによる権限の昇格
この例は単なるロジックに関するものではなく、むしろ慣例に関するものです。 それ 権限をエスカレーションするための規則を示します。
echo "Body of file..." | sudo tee root_owned_file > /dev/null
この例は、sudoコマンドに固有の制限をバイパスするために使用されているティーを示しています。Sudoは標準出力をファイルにパイプすることができません。STDOUTストリームを /dev /nullにダンプすることにより、コンソールのミラー化された出力も抑制します。
2.Vim で sudo コマンドを実行する
Vim では Sudo コマンドを使用できるため、sudo として実行するのを忘れた場合でもコマンドを使用できます。/etc/init.d/ などの読み取り専用ファイルがある場所で便利です。
tee コマンドを使用したロジック
これは Git のブランチのようなもの、あるいはそれよりも優れたものです。参照してください。 Rick Copeland による T のアナロジー. 。できれば、変更された例 (オリジナル) その使用法を理解するのに役立ちます。
curl "http://en.wikipedia.org/wiki/Pipeline_(Unix)" | tee original_site | sed 's/[^a-zA-Z ]/ /g' | tr 'A-Z ' 'a-z\n' | grep '[a-z]' | sort -u | comm -23 - /usr/share/dict/words
のターゲットであることを覚えておいてください。 tee
通常のファイルに限定されず、デバイス、FIFO などにも適用できます。また、別のものにパイプすることもできます tee
呼び出しなど。:-)
私は、 tee
コマンドは、長いパイプラインを含むシェル スクリプトをデバッグする場合に非常に役立ちます。これは、Perl で書き直すのが 10 年も遅れた恐ろしいシェル スクリプトの最終版ですが、まだ動作します。(偶然ですが、最後に変更されたのは 1998 年です。)
# If $DEBUG is yes, record the intermediate results.
if [ "$DEBUG" = yes ]
then
cp $tmp.1 tmp.1
cp $tmp.2 tmp.2
cp $tmp.3 tmp.3
tee4="| tee tmp.4"
tee5="| tee tmp.5"
tee6="| tee tmp.6"
tee7="| tee tmp.7"
fi
# The evals are there in case $DEBUG was yes.
# The hieroglyphs on the shell line pass on any control arguments
# (like -x) to the sub-shell if they are set for the parent shell.
for file in $*
do
eval sed -f $tmp.1 $file $tee4 |
eval sed -f $tmp.3 $tee5 |
eval sh ${-+"-$-"} $tee6 |
eval sed -f $tmp.2 $tee7 |
sed -e '1s/^[ ]*$/--@/' -e '/^--@/d'
done
実行される 3 つの sed スクリプトはひどいものです。それらを紹介するつもりはありません。これも半ばまともな使い方です eval
. 。通常の一時ファイル名 ($tmp.1 など) は固定名 (tmp.1 など) で保存され、中間結果は tmp.4 に保存されます。tmp.7。コマンドを更新する場合は、「」を使用します。"$@#"
' の代わりに '$*
' 示されているように。また、デバッグするとき、引数リストにはファイルが 1 つしかないため、デバッグ ファイルの踏みつけは問題になりません。
必要な場合は、入力の複数のコピーを一度に作成できることに注意してください。餌を与える必要はありません tee
別のものに命令します。
必要な人がいれば、次のバージョンを用意しています tee
呼ばれた tpipe
これにより、出力のコピーが複数のファイルではなく複数のパイプラインに送信されます。パイプライン (または標準出力) の 1 つが早期に終了した場合でも、処理は続行されます。(連絡先についてはプロフィールをご覧ください。)
tee は、出力を tee の引数として指定できるファイルにミラーリングするだけです。
あなたが示したケースでは、teeは(sudo経由で)スーパーユーザーとして呼び出され、その唯一の目的は、エコーを実行するユーザーの代わりにスーパーユーザーとしてファイルを書き込むことです。
Teeコマンドは、単にn+1のファイルを作成し、1コピーはstdoutに渡され、他のコピーはtee(すなわちファイル)に提供された引数にn:T に渡される引数の数