コマンド用の `tee`


15

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

echo Hello, World! | tee greeting.txt

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

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


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

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回使用します。最初は端末に表示し、次にプライマリ選択(クリップボード)に保存します。

echo $url | teeC xsel次のコマンドに渡す前に出力を表示するための何かまたはショートカットを想像してください(コマンドを連鎖する)、次のように結果を変数に保存することなく、コマンド全体を1行に連鎖させることができます:

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

また、次のようurlviewに表示、選択、開くのにも使用でき$BROWSERます。

bukuc 10-20 | urlview

3
試してみてくださいtee /dev/ttyまたはtty0(正確に覚えていけない...私は、道路上で午前)
ジョージ・バジリウー

2
info teeプロセスの置換、およびプログラムへのパイプティーの出力に言及しています
...-Xen2050

回答:


19

プロセス置換をサポートするシェルでは簡単です(bashなど)

$ 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
$ 

ありがとう!私が注意した2つのこと:1. sh(Bourneシェル)はその機能をサポートしていません。2.矢印は>()、プロセス置換の単一演算子の一部として固執する必要があります。

11

「コマンド用Tシャツ」の直接の類似物は、peemoreutilsからコマンドですteeただし、パイプ付き)。その引数は、パスとしてではなく、実行するコマンドとして使用され、ファイルに書き込まれるのではなく、入力がパイプに渡されます。すべてのコマンドにはpee、独自のパイプで接続した標準入力が与えられます。

を使用するとpee、両方xselcat入力で実行するように指定することで、必要な結果を取得できます。

echo foo | pee xsel cat

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

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


4
非常にクールな-それについて知らなかった
-steeldriver

2
それは...良い名前ではありません。
デビッドリチャービー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.