2012-02-18 16 views

答えて

21

あなたは、出力ストリームはttyのかそうでない場合は教えて-tテストスイッチを使用することができるはずです。

-t 2を使用してください。

+0

私が望んだとおりに機能します!ありがとうございました – Sigmun

25

は、技術的には、あなたのスクリプトを呼び出すことだかわからないので、標準入力/標準出力/標準エラー出力が「リダイレクト」されているかどうかを知らせることができません。それが別のシェルから呼び出されていない場合、 "リダイレクション"という概念はありません。

あなたが行かなければならないすべては、イン/アウト/ ERRのファイル記述子が何であるかの種類(端末、FIFO、パイプ、デバイス、などのファイル)です。通常は、出力がユーザーの画面に表示されているのか、それとも別のプロセスに表示されているのかを検出したいだけです。この場合、マットの答えに従って[ -t 1 ]を使用してください。

プロセスがリダイレクトされた場所と場所を知りたい場合は、シンボリックリンク/proc/$$/fd/1/proc/$$/fd/2の対象を調べてください。

誰かが./myscript.sh > /dev/pts/1234という別の端末にプロセスの出力を接続できることに注意してください。その後、 "リダイレクト"されますが、stdoutはまだ端末になります。

例:

$ ls -l /proc/$$/fd/1 > results 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/null 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' |cat 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/pts/0 
$ cat results 
lrwx------ 1 je4d je4d 64 2012-02-17 21:09 /proc/2463/fd/1 -> /dev/pts/11 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8302/fd/1 -> /dev/null 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8304/fd/1 -> pipe:[222798] 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8307/fd/1 -> /dev/pts/0 

[ -t 1 ]は、これらの第一及び第四のための真のだろう。

+2

これは私がいくつかのbashのものを理解することができる豊かな答えです。ありがとう! – Sigmun

+0

Thx!私はコマンドラインテストをしましたが、それは私の驚きのためには機能しませんでした。このコマンドは次のとおりです。 '(lsof -p $$; ls -l/proc/$$/fd; [-t 1] || echo -n NOT \; echo TERM:$$; ps --forest -s $$; )| cat -'は、fd 1に対して '/ dev/pts/1'を表示しますが、' NOT TERM'を表示します。だから[tag:bash]はリダイレクトされていることを知っています( '(...)')。しかし、$$は依然として親の[tag:bash]のPIDです。 – TrueY

+0

それはちょうど$$のことですが、サブシェルはそれに影響しません。だから私は代わりにbash -c '...'を使いました。 – je4d

関連する問題