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
プロセス置換 をサポートするシェルでは簡単です。バッシュ
$ 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
$
「コマンドのティー」の直接的な類似物は moreutilsからの[pee
コマンド (tee
ですが、パイプ付き)です。その引数は、パスとしてではなく、実行するコマンドとして使用され、入力はファイルに書き込まれるのではなく、それらにパイプされます。すべてのコマンドには、パイプを使用してpee
にパイプで入力した標準入力が与えられます。
pee
を使用すると、入力でxsel
とcat
の両方を実行するように指示することで、目的の結果を得ることができます。
echo foo | pee xsel cat
そこには、出力を行うための余分なcat
プロセスが浮かんでいます。これは、実際にはユースケースの問題ではありませんが、他の場合には理想的ではない可能性があります。これは、プロセス置換とは異なり、どのシェルでも機能しますが、もちろん、追加の(おそらくあまり一般的ではない)ツールをインストールする必要があります。
あなたはそれらを引用することでより複雑なコマンドを与えることができます:pee "xsel --display :1" cat
。これらはsh
で実行されるため、シェルのメタキャラクターに注意する必要があります。