2012-01-06 14 views
18

添付されたttyなしで実行すると静かにしたいbashスクリプトがあります(cronなど)。 私は、出力を条件付きで/ dev/nullに1行でリダイレクトする方法を探していました。 これは私が考えていたものの一例であるが、私は、スクリプト残念ながらbashの条件付きリダイレクト

#!/bin/bash 
# conditional-redirect.sh 
if tty -s; then 
    REDIRECT= 
else 
    REDIRECT=">& /dev/null" 
fi 
echo "is this visible?" $REDIRECT 

で出力を行う、より多くのコマンドがありますが、これは動作しません:

$ ./conditional-redirect.sh 
is this visible? 
$ echo "" | ./conditional-redirect.sh 
is this visible? >& /dev/null 

私はドン何tは何をしたいのリダイレクト-付きまたは変異体-NO-リダイレクトですべてのコマンドが重複している:

if tty -s; then 
    echo "is this visible?" 
else 
    echo "is this visible?" >& /dev/null 
fi 

EDIT:

"quiet"モードで何かを出力する方法があれば素晴らしいことでしょう。何かが本当に間違っているときは、私はcronから通知を受けたいかもしれません。これは、その時点から/dev/nullからすべてstdoutstderrを指示する

exec &>/dev/null 

答えて

20

bashために、次の行を使用することができます。それはexecの引数でないバージョンを使用します。

通常、exec xyzzyのようなものは、現在のプロセスのプログラムを新しいプログラムに置き換えますが、この引数のないバージョンを使用して、現在のプログラムを維持しながらリダイレクトを単純に変更することができます。あなたは、出力の大半が廃棄されたいが、まだ出力にいくつかのものをしたい場合は、新しいファイルハンドルを作成することができます

tty -s 
if [[ $? -eq 1 ]] ; then 
    exec &>/dev/null 
fi 

だから、あなたの特定のケースでは、あなたのようなものを使用することができますそれを行う。ような何か:

tty -s 
if [[ $? -eq 1 ]] ; then 
    exec 3>&1 &>/dev/null 
else 
    exec 3>&1 
fi 
echo Normal    # won't see this. 
echo Failure >&3   # will see this. 
+1

はい、作品を! (あるいはもっと単純な 'exec&>/dev/null') –

+0

..しかし、それは"静かな "モードですべての出力が失われるという欠点があります。私が実際に何かを出力したいと思う状況があるかもしれません。 upodated質問を参照してください。 –

+0

良い点、@ダニエル、私は歯の中で少し長くなっていて、古い習慣は激しく死ぬが、あなたの好みの方法で答えを更新した。 – paxdiablo

2

私は別の解決策を見つけたが、私はそれがpaxdiabloのanswerに比べて、不器用で感じる:

if tty -s; then 
    REDIRECT=/dev/tty 
else 
    REDIRECT=/dev/null 
fi 
echo "Normal output" &> $REDIRECT 
+2

出力がリダイレクトされない場合にのみ動作します。 '/ dev/tty'は常にあなたの端末装置を参照するので、' myscript> xyzzy.log'でスクリプトを実行した場合、 '/ dev/tty'に送信する出力はそのログファイルには終りません。それはあなたのプログラムをどのように使いたいかによって異なりますが、問題はありません。 – paxdiablo

1

あなたが機能を使用することができます

function the_code { 
    echo "is this visible?" 
    # as many code lines as you want 
} 

if tty -s; then # or other condition 
    the_code 
else 
    the_code >& /dev/null 
fi 
関連する問題