さまざまなコマンドをさまざまな記号で接続するチュートリアルをオンラインでよく目にします。例:
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バックグラウンドで起動され、command2command1を待たずに、すぐにフォアグラウンドで実行を開始します 終了します。command1の後の改行 オプションです。
A.2論理演算子
-
&&:ANDリストの作成に使用され、別のコマンドが正常に終了した場合にのみ1つのコマンドを実行できます。command1 && command2ここでは、
command2command1の後に実行されます 終了し、のみcommand1の場合 成功しました(終了コードが0の場合)。どちらのコマンドもフォアグラウンドで実行されます。このコマンドは書くこともできます
if command1 then command2 else false fiまたは単に
ifcommand1;次にcommand2; fi返品ステータスが無視された場合。 -
||:ORリストの作成に使用され、別のコマンドが正常に終了しなかった場合にのみ1つのコマンドを実行できます。command1 || command2ここでは、
command2command1の場合にのみ実行されます 失敗しました(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 | command2command1によって出力された出力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.txtout.txtの場合 存在する場合、コマンドの出力 その内容を置き換えます。存在しない場合は作成されます。 -
>>コード> :>と同じことをします ただし、ターゲットファイルが存在する場合は、新しいデータが追加されます。command >> out.txtout.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 <<< WORDWORDとして与えられたものは何でも が展開され、その値が入力として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にあります それだけ)。これらはリダイレクトではなく、プロセス置換です。