web-dev-qa-db-ja.com

コマンドの `tee`

teeは、パイプされた標準入力を標準出力およびファイルにリダイレクトできます。

echo Hello, World! | tee greeting.txt

上記のコマンドは、端末画面に挨拶を表示し、greeting.txtファイルの内容に保存して、その名前のファイルがない場合にファイルを作成します。

上書きする代わりに既存のファイルに追加するtee-aスイッチもあります。


パイプ入力をコマンドと標準出力にファイルの代わりにリダイレクトする便利な方法はありますか?

buku のラッパースクリプトを作成して、インデックス番号で指定されたブックマークのURLを一次選択にコピーしようとしています。

# bukuc:
#!/bin/sh
url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL
echo $url # DISPLAY
echo $url | xsel # PRIMARY SELECTION

ここでは、echoを2回回使用しています。最初は端末に表示し、次に1次選択(クリップボード)に保存します。

次のコマンドに渡す前に出力を表示するためのecho $url | teeC xselまたはショートカット(チェーンコマンド)を想像します。これにより、結果をvariable次のように:

buku -f 1 -p $1 | cut -f 2 | teeC xsel    

urlview とともに使用して、次のように$BROWSERで表示、選択、および開くこともできます。

bukuc 10-20 | urlview
15
user86041

プロセス置換 をサポートするシェルでは簡単です。バッシュ

$ echo foo | tee >(xsel)
foo
$ xsel -o
foo

それ以外の場合は、FIFOを使用できます(ただし、利便性はありません)。

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 
19
steeldriver

「コマンドのティー」の直接的な類似物は moreutilsからの[peeコマンドteeですが、パイプ付き)です。その引数は、パスとしてではなく、実行するコマンドとして使用され、入力はファイルに書き込まれるのではなく、それらにパイプされます。すべてのコマンドには、パイプを使用してpeeにパイプで入力した標準入力が与えられます。

peeを使用すると、入力でxselcatの両方を実行するように指示することで、目的の結果を得ることができます。

echo foo | pee xsel cat

そこには、出力を行うための余分なcatプロセスが浮かんでいます。これは、実際にはユースケースの問題ではありませんが、他の場合には理想的ではない可能性があります。これは、プロセス置換とは異なり、どのシェルでも機能しますが、もちろん、追加の(おそらくあまり一般的ではない)ツールをインストールする必要があります。

あなたはそれらを引用することでより複雑なコマンドを与えることができます:pee "xsel --display :1" cat。これらはshで実行されるため、シェルのメタキャラクターに注意する必要があります。

11
Michael Homer