/dev/null)" ];どういう意味ですか?">

if [-n "$(which voltdb 2> /dev/null)" ];どういう意味ですか?

if [-n /dev/null)" ];どういう意味ですか?">

私は非常に基本的なLinux技術を持っており、現在いくつかのシェルスクリプトを解析しようとしています。スクリプトの1つで次の行を見ました。

if [ -n "$(which voltdb 2> /dev/null)" ];

私は/ dev / nullがビットバケットであることを知っており、コマンドラインからvoltdbを実行すると、実行するパスが印刷されます。また、行全体は明らかにif文です。しかし、私はここの他の多くのことについて混乱しています。

  1. 2が/dev/nullと比較されるのはなぜですか?互換性のないタイプのようです。
  2. スイッチ-nは何をしますか? rm -r filename のようなスイッチの使い方に慣れていますが、-n はどのコマンドともペアになっていないようです。
  3. 括弧は何をしますか?ここでは、この表現以外の意味を持つようです。このテスト式[]は何を意味しますか?

基本的に、この行の役割は何ですか?私にはあまり知られていないことが多すぎるので、外国の文章を聞いて、あまりにも多くの単語を欠落して基本構造を理解していないのと似ています。

ベストアンサー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」句を実行します。

おすすめ記事