- PR -

標準出力を複数のストリームに分けたい

1
投稿者投稿内容
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2008-04-10 13:38
OS:CentOS4.4
ksh:pdksh-5.2.14-30.3

シェル内で、あるコマンドの標準出力に対して
・そのまま標準出力へ出力
・他のコマンドの標準入力へパイプ
といったことをしたいと考えています。

今のところ ksh での実装を考えていますが、
他のものならできるということであれば
ksh 以外でも実装を考えたいと思っています。

いったんファイルに落とすなり、
変数に取るなりしないと実現は難しいでしょうか?
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2008-04-10 14:45
teeコマンドをかませばできるでしょう。
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2008-04-10 15:05
引用:
tee - 標準入力から読んだ内容を標準出力とファイルとに書き出す



ファイル部分に具体的に何を指定すると、
コマンドの標準入力に渡せるのでしょうか?

知識が乏しいもので。。。
サンプルいただけませんか?
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2008-04-10 15:20
具体的にどういうことが実現できればいいのかわかりませんが

teeは次のように使います。

df | tee df.txt | grep cygwin

dfの出力結果をdf.txtに出力、かつ、dfの結果を次の処理に渡す(パイプライン)

UNIX環境が今ないのでcygwinでの実行結果です。

C:\Documents and Settings\app_user>df
Filesystem 1K-blocks Used Available Use% Mounted on
C:\cygwin\bin 156191960 95641680 60550280 62% /usr/bin
C:\cygwin\lib 156191960 95641680 60550280 62% /usr/lib
C:\cygwin 156191960 95641680 60550280 62% /
c: 156191960 95641680 60550280 62% /cygdrive/c
g: 156248156 97971240 58276916 63% /cygdrive/g
s: 155580064 150194084 5385980 97% /cygdrive/s
t: 155580064 150194084 5385980 97% /cygdrive/t

C:\Documents and Settings\app_user>df | tee df.txt | grep cygwin
C:\cygwin\bin 156191960 95641680 60550280 62% /usr/bin
C:\cygwin\lib 156191960 95641680 60550280 62% /usr/lib
C:\cygwin 156191960 95641680 60550280 62% /

C:\Documents and Settings\app_user>cat df.txt
Filesystem 1K-blocks Used Available Use% Mounted on
C:\cygwin\bin 156191960 95641680 60550280 62% /usr/bin
C:\cygwin\lib 156191960 95641680 60550280 62% /usr/lib
C:\cygwin 156191960 95641680 60550280 62% /
c: 156191960 95641680 60550280 62% /cygdrive/c
g: 156248156 97971240 58276916 63% /cygdrive/g
s: 155580064 150194084 5385980 97% /cygdrive/s
t: 155580064 150194084 5385980 97% /cygdrive/t
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2008-04-10 18:16
「そのまま標準出力へ」だと、パイプ後段のコマンドの標準出力と混ざりますが、それは問題ないでしょうか…?
単にコンソールに出力したいだけなら、標準エラーにする手もありますが。( 混ざるという意味では同じですが )

標準出力ならこんな感じ
 exec 3>&1
 tee /dev/fd/3 | 後段のコマンド
 exec 3>&-

標準エラーならこんな感じ
 tee /dev/stderr | 後段のコマンド
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2008-04-10 20:18
申し訳ありません。
前段のコマンドの分を入れずに書いたのと、sh, ksh で exec系の挙動が bash と違ったので、書き直します。
※bashに慣れていたので、sh,kshでのexecの挙動を勘違いしていました。

標準出力の場合
 前段のコマンド | ( tee /dev/fd/3 | 後段のコマンド ) 3>&1

標準エラーの場合
 前段のコマンド | tee /dev/stderr | 後段のコマンド
holic
ベテラン
会議室デビュー日: 2004/08/24
投稿数: 74
投稿日時: 2008-04-11 00:22
名前つきパイプを使えばよいのでは。
#Cygwin だと、今でも使えないんでしたっけ。

% mkfifo fifo
% somecommand | tee fifo | anothercommand
% cat fifo | yetanothercommand

まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2008-04-13 10:54
progman さん>
引用:

df | tee df.txt | grep cygwin



わかりづらくて申し訳ありません。
↑は tee で df.txt に落としていますが、これを標準出力へ出したいようなイメージです。
1.標準出力
2.grep の標準入力

1・2に両方出力したいということでした。


angel さん、holic さん>
サンプルありがとうございます。
両名のアドバイスでうまく解決できそうです。

ありがとうございました。

[ メッセージ編集済み 編集者: まさ 編集日時 2008-04-13 11:03 ]
1

スキルアップ/キャリアアップ(JOB@IT)