私は非常に基本的なLinux技術を持っており、現在いくつかのシェルスクリプトを解析しようとしています。スクリプトの1つで次の行を見ました。
if [ -n "$(which voltdb 2> /dev/null)" ];
私は/ dev / nullがビットバケットであることを知っており、コマンドラインからvoltdbを実行すると、実行するパスが印刷されます。また、行全体は明らかにif文です。しかし、私はここの他の多くのことについて混乱しています。
- 2が/dev/nullと比較されるのはなぜですか?互換性のないタイプのようです。
- スイッチ-nは何をしますか? rm -r filename のようなスイッチの使い方に慣れていますが、-n はどのコマンドともペアになっていないようです。
- 括弧は何をしますか?ここでは、この表現以外の意味を持つようです。このテスト式[]は何を意味しますか?
基本的に、この行の役割は何ですか?私にはあまり知られていないことが多すぎるので、外国の文章を聞いて、あまりにも多くの単語を欠落して基本構造を理解していないのと似ています。
答え1
このコードスニペットには多くの内容が含まれています。内部から外部への作業:
which voltdb 2> /dev/null
- ここで実行されるコマンドはですwhich
。呼び出されたら、環境変数のすべての項目で「voltdb」というコマンドをwhich
探します。PATH
で指定されたディレクトリの1つで「voltdb」という実行可能ファイルを見つけると、実行可能ファイルPATH
の完全修飾名が印刷されます。voltdb
最初の質問に答えるには、「2>」がリダイレクトの例です。各Unix / Linux / * BSDプロセスには3つの標準入力と出力があり、0はstdin、1はstdout、2はstderrです。コマンドラインで実行されるプログラムは通常、stderrにエラーメッセージを出力します。したがって、2を「/ dev / null」と数値的に比較する代わりに、「2> / dev / null」は入力を許可せず、ゼロバイトの出力を返す特殊ファイルにwhich
エラー出力を送信します/dev/null
。
とりわけ、この$(...)
設定は「含まれているコマンドを実行し、ここで '$('と ')'の間のすべての出力を語彙的に置き換えます」を意味します。これがシェルプログラムが実行する出力の置換です。
if [ -n "something" ];
出力置換の外側で「何か」がwhich
印刷される場所でフラグメントが実行されます。 「if」は、「if」の後に続くコマンドパイプラインが「成功」状態で終了したときにコードブロックを実行させるシェル制御フロー構造です。
実際、「-n」フラグは、「ゼロ以外の文字列長の次の引数に対してtrue」を意味します[
。]
2番目、3番目の質問に対する答えです。この[ ... ]
構成は、一部の論理条件(この場合は「ゼロ以外の文字列の長さ」)に対してtrue(成功コードで終了)またはfalse(失敗コードで終了)応答を提供します。
voltdb
最終的に、シェルのPATHに実行可能ファイルを含むディレクトリがある場合、コードスニペットはif-then-fiまたはif-then-else-fi制御フローの「true」句を実行します。
答え2
このコードは次のことを行います。
if [ -n "...." ];
二重引用符で囲まれたコードの実行結果が空の場合、ifステートメントはtrueです。
二重引用符内のコード:
$(which voltdb 2> /dev/null)
コマンドを実行しwhich voltdb
、STDERR(標準エラー)で発生したコマンドの出力をリダイレクトします/dev/null
。基本的に私たちはこれに興味がないので無視します。
結果は、which voltdb
voltdb 文字列と一致する PATH の実行可能ファイルパスを返します。
はい
$ which time
/usr/bin/time
$ which time 2> /dev/null
/usr/bin/time
について2>
?
2>
次のいずれかの出力をリダイレクトするための省略表記法です。小川プログラム実行時に自動的に設定されます。フローは次のとおりです。
- 0 - 標準入力(STDINとも呼ばれる)
- 1 - 標準出力(STDOUTとも呼ばれる)
- 2 - 標準エラー(STDERRとも呼ばれる)
したがって、STDERRの出力を取得して削除するには、次のようにします。
$ which time 2> /dev/null
STDOUTから出力を取得してSTDERRにリダイレクトするには、次のようにします。