さまざまなコマンドをさまざまな記号で接続するチュートリアルをオンラインでよく目にします。例:
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
にあります それだけ)。これらはリダイレクトではなく、プロセス置換です。