stdoutとstderrがリダイレクトされているbashスクリプトで、より正確にはテストしたいと思います。bashスクリプトでstdoutとstderrのリダイレクトをテストする
アイデアはありますか?
$*
bash変数は私にこの情報を与えません。
if [ -t 1 ] ; then
echo stdout is a terminal
else
echo stdout is not a terminal
fi
使用-t 0
stdin
用:
stdoutとstderrがリダイレクトされているbashスクリプトで、より正確にはテストしたいと思います。bashスクリプトでstdoutとstderrのリダイレクトをテストする
アイデアはありますか?
$*
bash変数は私にこの情報を与えません。
if [ -t 1 ] ; then
echo stdout is a terminal
else
echo stdout is not a terminal
fi
使用-t 0
stdin
用:
あなたは、出力ストリームはtty
のかそうでない場合は教えて-t
テストスイッチを使用することができるはずです。
に-t 2
を使用してください。
は、技術的には、あなたのスクリプトを呼び出すことだかわからないので、標準入力/標準出力/標準エラー出力が「リダイレクト」されているかどうかを知らせることができません。それが別のシェルから呼び出されていない場合、 "リダイレクション"という概念はありません。
あなたが行かなければならないすべては、イン/アウト/ 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 ]
は、これらの第一及び第四のための真のだろう。
これは私がいくつかのbashのものを理解することができる豊かな答えです。ありがとう! – Sigmun
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
それはちょうど$$のことですが、サブシェルはそれに影響しません。だから私は代わりにbash -c '...'を使いました。 – je4d
私が望んだとおりに機能します!ありがとうございました – Sigmun