2009-05-30 10 views
19

それは私がプログラムの出力を表示したくないときには、このタイプのは本当に迷惑なんだのコマンドラインショートカットがあります。「>を/ dev/null 2>&1」

$ program >/dev/null 2>&1 

ジェネリックシェルが最良であるが、他のシェルは、特にbashやダッシュ、あまりにも知っているのは興味深いだろう:私は書くための短い方法があるかどうかを知るのが大好きです。

答えて

14
>& /dev/null 
+0

ありがとうございました(それはわかりませんでしたが、「ショートカット」は文字数の半分以下です)。これはほとんど同じくらいのタイピングです。実際には、2>&1の部分は簡単ですが、/ dev/nullは入力するのが面倒です。 –

+3

私は本当にあなたが実行していることを知りたいのですが、stdoutとstderrを/ dev/nullにパイプするように強制するので、/ dev/nullの入力は煩わしいものになります。 –

+7

Bashのマニュアルでは、 ">&n /"(nは整数)とのあいまいさを避けるために、 "&>/dev/null"の形式が好きです。私はそれがBashの外で移植可能だとは思わない。 – ephemient

1

/dev/nullが入力しても過言であれば、あなたは(rootとして)可能性のようなものです:次に、あなただけの

ln -s /dev/null /n 

を行うことができます:

program >/n 2>&1 

しかし、もちろん、スクリプトをこの方法で書くと、そのシンボリックリンクを最初に設定することなく、他のシステムに移植することはできません。

+0

上記の答えと組み合わせて、私はできると思います: プログラム&>/n これはかなり良いです。ありがとう! –

+1

があったはずです プログラム>&/ n –

6

ほとんどのシェルはエイリアスをサポートしています。

function nullify() { 
    "[email protected]" >/dev/null 2>&1 
} 

は、この機能を使用するには:私はちょうどあなたがこのために関数を書くことができます

program no 
+2

bashでは、それは次のようになります:alias no = '2>/dev/null>/dev/null'; noコマンドarg arg – lhunath

13

を入力し

alias -g no='2> /dev/null > /dev/null' 

:たとえば、私の.zshrcに私のようなものを持っています:

nullify program arg1 arg2 ... 

もちろん、t彼はあなたが何を望むものであれ機能します。これは例えば1文字にすることができます。

ところでexecを使用すると、stdoutstderr/dev/nullに一時的にリダイレクトできます。私はこれがあなたの場合に役立つかどうかはわかりませんが、私はそれを共有することを考えました。

# Save stdout, stderr to file descriptors 6, 7 respectively. 
exec 6>&1 7>&2 
# Redirect stdout, stderr to /dev/null 
exec 1>/dev/null 2>/dev/null 
# Run program. 
program arg1 arg2 ... 
# Restore stdout, stderr. 
exec 1>&6 2>&7 
0

最も移植性の高いソリューションであり、最良の答えは、端末(PC)上のマクロになると私は思います。

こうすることで、関係なく、あなたがにログインどのようなサーバー、それは常に存在しません。 Windowsを実行してしまった場合

することは、あなたは、2つのコードの小さなラインで(それをグーグル、それはオープンソースです)AHKで望ましい結果を得ることができます。これは、鍵の任意のストリングを、インサイチュで他の鍵のストリングに変換することができます。

「ugly.sh >> NULL」と入力すると、「ugly.sh 2> & 1>/dev/null」と書き換えられます。他のプラットフォーム用の

ソリューションはやや困難です。 AppleScriptはキーボードプレスで貼り付けることができますが、簡単には起動できません。

8
bashのzshの

、およびダッシュ

$ program >&- 2>&- 

はまた&-が悪いファイルディスクリプタであるため、は、他のシェルで動作するように見えることがあります。

この解決策は、ファイル記述子を/dev/nullにリダイレクトするのではなく、プログラムを中止させる可能性があることに注意してください。

+0

"可能性があります"?私はそれを「通常は」と呼ぶだろう。書き込みが成功するかどうかをチェックしないプログラムは、* buggy *です。 –

+0

私が正しいとすれば、 'sh'は与えられたディストリビューションのデフォルトシェルの名前です、' dash'はDebianバージョンの 'ash'に与えられた名前です。 [wikipedia](https://en.wikipedia.org/wiki/Dash_(シェル))を参照してください。どうぞお分かりですか? – loxaxs

+0

@loxaxs:Ubuntuでは、 'sh'は' dash'を実行します。私はそれが私のために(POSIX互換モードで 'bash'を動かすことについて何かを思い出すように思えますが)私のために何をしたのか覚えていませんが、あいまいさのために今削除しました。 – Zaz

2

出力のリダイレクトが本当に必要ではないこともよくあることです。多くのUnixおよびLinuxプログラムでは、通常は-nまたは-qのいずれかの出力を抑制し、成功または失敗の値のみを返す「サイレントフラグ」を受け入れます。 :stdinを読んでいないので、(:)または|:ベースのソリューションは、エラーが発生する可能性があります:

grep foo bar.txt >/dev/null 2>&1 
if [ $? -eq 0 ]; then 
    do_something 
fi 

例えば

grep -q foo bar.txt 
if [ $? -eq 0 ]; then 
    do_something 
fi 
+0

'$?'を不必要にチェックするのは、 'if grep -q foo bar.txt;そのようなログ計装をしている人が '$? 'がどこに変わらないと予想されるのか慎重でないならば、新たに追加されたログ行があなたのテストを中断させるような、あなたのコードは壊れやすくなります。 –

2

編集のように書き換えることができます。 Zazの答えで提案されているように、ファイル記述子を閉じるほど悪くないかもしれませんが。

はbashやbashの互換シェルの場合
  • (zshの...):

    $ program &>/dev/null 
    OR 
    $ program &> >(:) # Should actually cause error or abortion 
    
  • すべてのシェルの場合:

    $ program 2>&1 >/dev/null 
    OR 
    $ program 2>&1|: # Should actually cause error or abortion 
    

    $ program 2>&1 > >(:)はダッシュためには機能しません。ファイル置換のプロセス置換権の操作を拒否します。

説明:

  • 2>&1はSTDOUT(ファイル記述子1)に標準エラー(ファイル記述子2)にリダイレクトします。
  • |は、別のコマンドのstdoutに対するstdoutの標準的な配管です。
  • :は何もしないシェル組み込みです(trueに相当)。
  • &>は、stdout出力とstderr出力の両方をファイルにリダイレクトします。
  • >(your-command)はプロセス置換です。これは、特別なファイルへのパスで置き換えられます(例:/proc/self/fd/6)。このファイルはコマンドyour-commandの入力ファイルとして使用されます。

注:閉じられたファイル記述子への書き込みしようとしているプロセスが| trueに書き込みをしようとするよりも、流産を引き起こす可能性が高いですEBADF(不良ファイルディスクリプタ)エラーが発生します。後者の場合、EPIPE(パイプ)エラーが発生します(Charles Duffyのコメントを参照)。

+0

私は「同等」とは言いません。 '>& - ' *実際には*記述子を閉じ、振る舞いはかなり異なります(閉じられたFDに結果を書き込むと、別の致命的なエラーが発生する可能性があります)。 –

+0

'' python -c 'print "hello"'>& - '、' python -c 'print "hello"'を比較してください。 true 'と 'python -c'は" hello "'>/dev/null'を出力します。 – loxaxs

+1

'... | true 'は 'EPIPE'を返しますが、'>& 'は' EBADF'を返します - 二つの完全に別々のエラーです。 Pythonランタイムがそれらを区別するのに便利でないということは、ここでもそこにもありません。 –

1

Ayman Hourieh's solutionは、過度に冗談なプログラムの1回限りの呼び出しに適しています。しかし、あなたは出力を抑制したい一般的に呼ばれるプログラムの唯一の小さなセットがあります場合(あなたが別のシェルを使用している場合、または同等)、あなたの.bashrcファイルに以下を追加することによって、それらをサイレンシング考える:

CHATTY_PROGRAMS=(okular firefox libreoffice kwrite) 
for PROGRAM in "${CHATTY_PROGRAMS[@]}" 
do 
    printf -v eval_str '%q() { command %q "[email protected]" &>/dev/null; }' "$PROGRAM" "$PROGRAM" 
    eval "$eval_str" 
done 

この通常の名前を使ってプログラムを引き続き呼び出すことができますが、stdoutとstderrの出力はビットバケットに表示されなくなります。

特定のプログラムでは、出力されたロギング/デバッグ出力の量を設定できることにも注意してください。 KDEアプリケーションでは、kdebugdialogを実行し、デバッグ出力を選択的またはグローバルに無効にすることができます。

+1

文字列をリストのように使う理由は何ですか?あなたがネイティブbashを書いているなら(そして、 'function'キーワードを使うことはあなたのコードが移植可能であることを意味しないことを意味します; POSIX)、あなたは配列を持つことが保証されます。 'chatty_programs =(okool firefox何でも); "$ {chatty_programs [@]}"内のプログラム用。してください。あなたのコードはIFSの現在の値に依存しません。 –

+1

私はまた、シェルがあなたのために引用を実行することを考慮したいと思います: 'printf -v eval_str '%q(){command%q" $ @ "&>/dev/null; } '"$ program" "$ program"; eval "$ eval_str" ' - 誰かが慣用句を借用して制御できない入力名で実行する場合、ジョーカーは' $(rm -rf〜) 'という名前のスクリプトを作成します(これは有効なファイル名です - - 作成しようとすると、一重引用符を使用しても問題ありません)。 –

+0

@CharlesDuffy:そうです。提案された改善に感謝します。私はそれに応じて私の答えを改訂しました。 – Psychonaut