シェルの制御およびリダイレクト演算子は何ですか?

シェルの制御およびリダイレクト演算子は何ですか?

さまざまなシンボルを使用してさまざまなコマンドをリンクするオンラインチュートリアルを頻繁に表示します。たとえば、

command1 |  command2
command1 &  command2
command1 || command2    
command1 && command2

他の人はコマンドをファイルにリンクするようです。

command1  > file1
command1  >> file1

これらは何ですか?名前は何ですか?彼らは何をしていますか?もっとありますか?


これは問題のメタスレッドです。

ベストアンサー1

これをシェル演算子といい、その他にもあります。 2つの主要カテゴリのうち最も一般的なカテゴリを簡単に説明します。制御演算子そしてリダイレクト演算子、とbashシェルで動作する方法。

A. 制御演算子

POSIXの定義

シェルコマンド言語で制御機能を実行するタグ。
次の記号のいずれかです。

&   &&   (   )   ;   ;;   <newline>   |   ||

バッシュから|&

A!いいえ制御演算子ですが、予約語。論理NOT [否定演算子]になります。算術表現内部テスト構造(まだ空白の区切り文字が必要です)。

A.1 リスト終了者

  • ;: 最初のコマンドの結果に関係なく、他のコマンドが完了した後に 1 つのコマンドを実行します。

      command1 ; command2
    

まずcommand1、前景で実行し、完了するとcommand2実行されます。

文字列リテラルにないか、特定のキーワードの後に​​改行がありません。いいえセミコロン演算子と同じです。単純なコマンドの区切りリスト;はまだあります。リスト- シェルのパーサーと同様に、別の単純な;コマンドに従う単純なコマンドは実行前に読み取る必要があり、改行はコマンドのリスト全体またはリストのリストを区別できます。違いは微妙ですが複雑です。改行は、シェルが改行後のデータを読み取る前のコマンドがないと仮定し、シェルが読み取った単純なコマンドの評価を開始できる点を示しますが、セミコロンはそうではありません;

  • &:バックグラウンドでコマンドが実行されるため、同じシェルで作業を続けることができます。

       command1 & command2
    

ここではcommand1バックグラウンドで起動し、終了をcommand2待たずに直ちにフォアグラウンドで実行を開始しますcommand1

次の改行文字はcommand1オプションです。

A.2 論理演算子

  • &&:他のコマンドが正常に終了した場合にのみ、1つのコマンドを実行できるANDのリストを作成するために使用されます。

       command1 && command2
    

完了するとここで実行されますcommand2command1ただ成功した場合command1(終了コードが0の場合)、両方のコマンドはフォアグラウンドで実行されます。

このコマンドは次のように書くこともできます。

    if command1
    then command2
    else false
    fi

またはif command1; then command2; fi返品ステータスを無視してください。

  • ||:他のコマンドが終了しない場合にのみ、1つのコマンドを実行できるORリストを作成するために使用されます。

       command1 || command2
    

ここでは、command2失敗時にのみ実行されますcommand1(ゼロ以外の終了ステータスが返される場合)。どちらのコマンドもフォアグラウンドで実行されます。

このコマンドは次のように書くこともできます。

    if command1
    then true
    else command2
    fi

またはより短い方法でif ! command1; then command2; fi

&&とは||関連付けられていることに注意してください。シェル論理演算子&&および||の優先順位より多くの情報を知りたいです。

  • !:これは "not"演算子として機能する予約語です(ただし、区切り文字が必要です)。コマンドの戻り状態を否定するために使用されます。コマンドがゼロ以外の状態を返す場合は、ゼロを返します。状態0の場合は1を返します。プログラムロジックNOT 1を返すことも実用的ですtest

      ! command1
    
      [ ! a = a ]
    

算術式の実際のNOT演算子:

    $ echo $((!0)) $((!23))
    1 0

A.3 パイプラインオペレータ

  • |: あるコマンドの出力を別のコマンドの入力に渡すパイプ演算子です。パイプ演算子で作成されたコマンドが呼び出されます。管路

       command1 | command2
    

    印刷されたすべての出力command1はに入力として渡されますcommand2

  • |&2>&1 |:これはbashとzshの略です。あるコマンドの標準出力と標準エラーを別のコマンドの入力に渡します。

      command1 |& command2
    

A.4その他のリスト句読点

;;終了を表示するためにのみ使用されます。ケースステートメント。 Ksh、bash、zshは;&次のケースにジャンプし;;&(ATT kshではない)、後続のケースをテストし続ける機能もサポートします。

(そして)慣れてください。グループコマンドサブシェルから始めます。{および}グループコマンドを使用しますが、サブシェルで実行しないでください。バラよりこの回答シェル構文のさまざまな種類の括弧、角括弧、および中括弧について話し合います。

B. リダイレクト演算子

リダイレクト演算子のPOSIX定義

シェルコマンド言語でリダイレクト機能を実行するトークンです。次の記号のいずれかです。

<     >     >|     <<     >>     <&     >&     <<-     <>

これにより、コマンドの入力と出力を制御できます。単純なコマンド内でもコマンドの後にも表示できます。リダイレクトは、表示された順序で左から右に処理されます。

  • <:コマンドを入力します。

      command < file.txt
    

上記の内容はのcommand内容に従って実行されますfile.txt

  • <>:上記と同じですが、ファイルは次の場所で開きます。読み取り+書き込み代わりにパターン読み取り専用:

      command <> file.txt
    

ファイルが存在しない場合は生成されます。

この演算子はほとんど使用されません。なぜなら、コマンドは通常読むしかし、標準入力ではさまざまな特定の状況で役に立ちます。

  • >:コマンドの出力をファイルに送信します。

      command > out.txt
    

上記は出力をcommandout.txtファイルが存在する場合はその内容が上書きされ、ファイルが存在しない場合はファイルが生成されます。

この演算子はまた、何かを印刷するかどうかを選択するためによく使用されます。標準エラーまたは標準出力:

    command >out.txt 2>error.txt
 

上記の例では、>標準出力がリダイレクトされ、2>標準エラーがリダイレクトされます。リダイレクトされた出力を使用することも可能です1>が、これがデフォルト値なので、1一般的に省略して単純に>

したがって、これを実行しcommand、エラーメッセージと共にfile.txt出力を保存するには、次の手順を実行します。out.txterror.txt

    command < file.txt > out.txt 2> error.txt
  
  • >|::と同じですが、シェルが>上書きを拒否するように設定されていても(set -Cまたは使用set -o noclobber)ターゲットを上書きします。

      command >| out.txt
    

存在する場合out.txtの出力はcommandその内容を置き換えます。存在しない場合に生成されます。

  • >>:と同じです>が、ターゲットファイルが存在する場合は新しいデータが追加されます。

      command >> out.txt
    

out.txt存在する場合は、commandすでに存在する項目に出力を追加します。存在しない場合に生成されます。

  • >&:(POSIX仕様に従って)次に囲まれた場合数字1>&2)または-右(1>&-)リダイレクトのみ可能一つファイル記述子を削除または閉じます(>&-)。

>&ファイル記述子番号の後に続くのは、ファイル記述子をリダイレクトする移植可能な方法であり、ファイル>&-記述子を閉じる移植可能な方法です。

このリダイレクトの右側がファイルの場合は、次のトピックをお読みください。

  • >&&>および:(上記>>&参照&>>)標準エラーと標準出力をそれぞれ置換または追加してリダイレクトします。

      command &> out.txt
    

標準エラーと標準出力は両方commandに保存され、out.txt内容を上書きするか、内容がない場合は新しく作成されます。

    command &>> out.txt
 

上記と同じです。ただしout.txt、存在する場合の出力とエラーがcommand追加されます。

この&>亜種はbashcsh >&(数十年前)に由来しています。これらはすべて他のPOSIXシェル演算子と競合するため、移植可能なスクリプトには使用しないでくださいsh

  • <<:ここに文書があります。通常、複数行の文字列を印刷するために使用されます。

       command << WORD
           Text
       WORD
    

    ここでは、上記の例で次の項目が見つかるまですべてが入力として使用されcommandます。通常、またはそのバリアントですが、目的の英数字(単なる)文字列にすることができます。の一部が引用またはエスケープされると、ここの文書のテキストは文字通り処理され、拡張(変数など)は行われません。引用符なしで置くと、変数が拡張されます。詳細については、次を参照してください。WORDTextWORDEoFWORDバッシュマニュアル

    command << WORD ... WORD出力を別のコマンドに直接パイプするには、パイプを<< WORD終了するWORDの後ろまたは後ろの行ではなく、同じ行に配置する必要があります。たとえば、

       command << WORD | command2 | command3...
           Text
       WORD
    
  • <<<:ここの文字列はここのドキュメントに似ていますが、1行です。これは、Unixポートまたはrc(元の場所)、zsh、ksh、yash、およびbashの特定の実装にのみ存在します。

      command <<< WORD
    

与えられたすべてはWORD拡張され、その値はに入力として渡されますcommand。これは通常、変数の内容をコマンドに入力として渡すために使用されます。たとえば、

     $ foo="bar"
     $ sed 's/a/A/' <<< "$foo"
     bAr
     # as a short-cut for the standard:
     $ printf '%s\n' "$foo" | sed 's/a/A/'
     bAr
     # or
     sed 's/a/A/' << EOF
     $foo
     EOF

他の演算子(>&-、、x>&y x<&y)を使用してファイル記述子を閉じたりコピーしたりできます。これについての詳細は、シェルマニュアルの関連セクション(ここ例:バッシュ)。

ここでは、Bourneに似たシェルの最も一般的な演算子のみを扱います。一部のシェルには独自の追加リダイレクト演算子があります。

Ksh、bashおよびzshにも<(…)>(…)および構造があります=(…)(後者のみzsh)。これはリダイレクトではありません。プロセスの交換

おすすめ記事