2016-10-26 7 views
4

私は現在の標準出力リダイレクトを取得しようとしていますが、何らかの問題があります。Linuxファイル記述子 - 現在のリダイレクトstdoutファイルを取得していますか?

myscript.sh > /tmp/output.log 

はmyscript.shでは、私はそれがに出力されているファイルかを調べる必要があります。

私は常に標準出力のリダイレクトすなわちで実行されるスクリプトを持っています。私は(動作しない)現在、これをしようとしている

logfile=$(readlink -f /proc/self/fd/1) 

例えば、ログファイル= /tmp/sflq.r3fを出力しています。代わりに/tmp/output.logに行くことがわかります

これは可能ですか?それが重要な場合

私は...

感謝をKornシェルを使用しています!

答えて

4

$()はパイプを使用します(または、kshのように表示されます(kshは通常、他のシェルのパイプであるものをエミュレートするために使用される一時ファイルです)。readlinkの出力をキャプチャします。

$()の中では、stdoutはパイプ(またはkshの場合の一時ファイル)です。

次のようなもので、この介在標準出力ファイルを回避することができます:今

{ logfile=$(readlink -f /proc/self/fd/3); } 3>&1 
# my ksh 93 needs the { ;} -- dash, and zsh don't 
echo "The logfile is: $logfile" 

./myscript.sh > /tmp/output.log 
echo OUTPUT.LOG 
cat /tmp/output.log 

はあなたを与える必要があります。

OUTPUT.LOG 
The logfile is: /tmp/output.log 

を別のオプションがにあります変数を避ける方法を考える全部:

echo -n "The logfile is: " 
readlink -f /proc/self/fd/1 #goes straight to stdout so no need to capture 
+0

ログファイルは/ proc/18117/fd/3 – John

+0

@Johnです。申し訳ありませんが、kshでテストしてください。 'ksh'については、上記のような中括弧に追加する必要があります。それは私のために働いています( 'ksh version sh(AT&T Research)93u + 2012-08-01') – PSkocik

+0

それをしました!なぜ中括弧が必要なのか、または仕事を探した後にしばらく時間を費やすべきであることの短いバージョンがありますか?ありがとうございます! – John

0

皆さんは、/proc/*self*/fdにかなり固定されているようです。この自己は...あなたのコードの呼び出しのコンテキストで、スクリプトの体内に/proc/$$/fdのようなものを使用することは良いアイデアではないでしょう場合

を正確に何を意味するのを検討してください(ヒント:$(readlink …)はサブシェルで実行されます。)

+0

それは良い点であり、はるかに単純な解決策になります。しかし、その解決策のスペルがもっと役立つでしょう(おそらくそうでないこと、民間の配達と組み合わせると落選を促したのでしょう)。 – mklement0

+0

@ mklement0幸運にも、私はアップ・ボートのためにここにいません。とにかく答えは '/ proc/$$/fd'です。おそらく私はこれを明示する必要がありました... – Jubal

+0

私はそれを聞いてうれしいですが、私は知識を効果的に共有するためにここにいると思います。 はい、回答にはすべての関連情報が含まれていますが、その_form_はその情報を効果的に伝達する方法で取得します。 あなたの答えが_recognizably_ superiorであれば、それは票を集めて、時間の経過とともにそれを準最適アプローチ(「自己」)と対比させることに重点を置くことはそれほど重要ではないと考えます。 – mklement0

関連する問題