GNU/Linux >> Linux の 問題 >  >> Linux

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

さまざまなコマンドをさまざまな記号で接続するチュートリアルをオンラインでよく目にします。例:

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

他の人はコマンドをファイルに接続しているようです:

command1  > file1
command1  >> file1

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

この質問に関するメタスレッド..

承認された回答:

これらはシェル演算子と呼ばれ、はい、もっとたくさんあります。 2つの主要なクラス、制御演算子とリダイレクト演算子の中で最も一般的なものと、bashシェルに関してそれらがどのように機能するかについて簡単に説明します。

A。制御演算子

POSIXの定義

シェルコマンド言語では、制御機能を実行するトークン。
次の記号のいずれかです:

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

そして|& bashで。

ない 制御演算子ですが、予約語です。これは、算術式内およびテスト構造内で論理NOT [否定演算子]になります(スペース区切り文字が必要です)。

A.1ターミネータのリスト

  • ; :最初のコマンドの結果に関係なく、次々にコマンドを実行します。

    command1 ; command2
    

    最初のcommand1 フォアグラウンドで実行され、終了したら command2 実行されます。

    文字列リテラル内にない、または特定のキーワードの後に​​ある改行はではありません セミコロン演算子と同等です。 ;のリスト 区切られた単純なコマンドはまだリストです –シェルのパーサーと同様に、;に続く単純なコマンドを引き続き読み取る必要があります。 実行前に単純なコマンドを区切りますが、改行はコマンドリスト全体またはリストのリストを区切ることができます。違いは微妙ですが複雑です。シェルに改行に続くデータを読み込むための以前の命令がない場合、改行は、シェルが既に読み込んだ単純なコマンドの評価を開始できるポイントを示しますが、; セミコロンはありません。

  • :これにより、バックグラウンドでコマンドが実行され、同じシェルでの作業を続行できます。

     command1 & command2
    

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

    command1の後の改行 オプションです。

A.2論理演算子

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

     command1 && command2
    

    ここでは、 command2 command1の後に実行されます 終了し、のみ command1の場合 成功しました(終了コードが0の場合)。どちらのコマンドもフォアグラウンドで実行されます。

    このコマンドは書くこともできます

    if command1
    then command2
    else false
    fi
    

    または単にifcommand1;次にcommand2; fi 返品ステータスが無視された場合。

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

     command1 || command2
    

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

    このコマンドは書くこともできます

    if command1
    then true
    else command2
    fi
    

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

    &&に注意してください および|| 左連想です。シェル論理演算子の優先順位&&、||を参照してください。詳細については。

  • :これは「not」演算子として機能する予約語です(ただし、区切り文字が必要です)。コマンドの戻りステータスを否定するために使用されます。コマンドがゼロ以外のステータスを返す場合は0を返し、ステータス0を返す場合は1を返します。 。また、 testの論理否定 ユーティリティ。

    ! command1
    
    [ ! a = a ]
    

    そして、算術式内の真のNOT演算子:

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

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

  • | :パイプ演算子。1つのコマンドの出力を別のコマンドへの入力として渡します。パイプ演算子から作成されたコマンドはパイプラインと呼ばれます。

     command1 | command2
    

    command1によって出力された出力 command2への入力として渡されます 。

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

    command1 |& command2
    

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

;; ケースステートメントの終わりを示すためにのみ使用されます。 Ksh、bash、zshも;&をサポートしています 次のケースにフォールスルーし、;;& (ATT kshではありません)続行して後続のケースをテストします。

関連:プログラムによってアクセスされるファイルを一覧表示しますか?

および コマンドをグループ化し、サブシェルで起動するために使用されます。 { および} コマンドもグループ化しますが、サブシェルで起動しないでください。シェル構文のさまざまな種類の括弧、角かっこ、中かっこについては、この回答を参照してください。

B。リダイレクト演算子

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

シェルコマンド言語で、リダイレクト機能を実行するトークン。これは、次の記号の1つです。

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

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

  • < :コマンドに入力を与えます。

    command < file.txt
    

    上記はコマンドを実行します file.txtの内容について 。

  • <> :上記と同じですが、ファイルは読み取り+書き込みで開いています 読み取り専用ではなくモード :

    command <> file.txt
    

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

    コマンドは通常読み取りのみであるため、この演算子が使用されることはめったにありません。 彼らの標準から、それは多くの特定の状況で重宝することができますが。

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

    command > out.txt
    

    上記はコマンドの出力を保存します out.txtとして 。ファイルが存在する場合はその内容が上書きされ、存在しない場合は作成されます。

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

    command >out.txt 2>error.txt
    

    上記の例では、> 標準出力と2>をリダイレクトします 標準エラーをリダイレクトします。 1>を使用して出力をリダイレクトすることもできます ただし、これがデフォルトであるため、 1 通常は省略され、単に>と記述されます。 。

    したがって、コマンドを実行するには file.txtに その出力をout.txtに保存します およびerror.txtのエラーメッセージ 実行します:

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

    command >| out.txt
    

    out.txtの場合 存在する場合、コマンドの出力 その内容を置き換えます。存在しない場合は作成されます。

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

    command >> out.txt
    

    out.txtの場合 存在する場合、コマンドの出力 すでにそこにあるものが何であれ、それに追加されます。存在しない場合は作成されます。

  • >& :(POSIX仕様による)数字で囲まれている場合 ( 1>&2 )または- 右側( 1>&- )どちらかが1つだけをリダイレクトします ファイル記述子またはそれを閉じます(>&-

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

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

  • >&&> >>& および&>> :(上記もお読みください)標準エラーと標準出力の両方をリダイレクトし、それぞれ置換または追加します。

    command &> out.txt
    

    コマンドの標準エラーと標準出力の両方 out.txtに保存されます 、コンテンツを上書きするか、存在しない場合は作成します。

    command &>> out.txt
    

    上記と同じですが、 out.txtの場合を除きます 存在する場合、コマンドの出力とエラー それに追加されます。

    &> バリアントはbashに由来します 、>& バリアントはcshから来ています(数十年前)。これらは両方とも他のPOSIXシェル演算子と競合するため、ポータブル shでは使用しないでください。 スクリプト。

  • << :ヒアドキュメント。複数行の文字列を印刷するためによく使用されます。

     command << WORD
         Text
     WORD
    

    ここでは、コマンド 次のWORDの出現が見つかるまで、すべてを取得します 、テキスト 上記の例では、入力として。 WORD 多くの場合、 EoF またはそのバリエーションとして、任意の英数字(だけでなく)の文字列を使用できます。 WORDの場合 が引用されている場合、ヒアドキュメントのテキストは文字通りに扱われ、展開は実行されません(たとえば変数に対して)。引用符で囲まれていない場合、変数は展開されます。詳細については、bashのマニュアルを参照してください。

    コマンド<の出力をパイプする場合 1つまたは複数のコマンドに直接パイプを配置するには、パイプを <と同じ行に配置する必要があります。 、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 '%sn' "$foo" | sed 's/a/A/'
     bAr
     # or
     sed 's/a/A/' << EOF
     $foo
     EOF
    

他のいくつかの演算子(>&- x>&y x <&y )を使用して、ファイル記述子を閉じたり複製したりできます。それらの詳細については、シェルのマニュアルの関連セクションを参照してください(たとえば、bashの場合)。

関連:変数の展開を延期する方法は?

これは、ボーンのようなシェルの最も一般的な演算子のみをカバーしています。一部のシェルには、独自のリダイレクト演算子がいくつか追加されています。

Ksh、bash、zshにも構文 <(…)があります 、>(…) および=(…) (後者は zshにあります それだけ)。これらはリダイレクトではなく、プロセス置換です。


Linux
  1. InnoDBとMyISAMの違いは何ですか?

  2. Readlineワードセパレーターとは何ですか?

  3. 現在の制御端末と`/dev / tty`の間にはどのような関係がありますか?

  1. vdso と vsyscall とは何ですか?

  2. Linux での lsof と netstat の違いは何ですか?

  3. ext4、ReiserFS、JFS、および XFS の (欠点) 利点は何ですか?

  1. ユーザーとグループを管理する標準の CLI プログラムは何ですか?

  2. rdesktop と xfreerdp の違いは何ですか?

  3. OpenSSL と mod_ssl が apache2 にインストールされているかどうかを確認するコマンドは何ですか?