& ; は単項演算子ですか、それとも二項演算子ですか?

& ; は単項演算子ですか、それとも二項演算子ですか?

&POSIX 2013以降の制御演算子関連;

非同期リストの場合

バックグラウンドでコマンドを実行する形式は次のとおりです。

command1 & [command2 & ... ]

順次リストの場合、

順次実行コマンドの形式は次のとおりです。

command1 [; command2] ...
  1. &1元ですか、2元ですか?;1元ですか、2元ですか?

    &;これはバイナリのように見え、前と後のコマンドに対して機能し、2つのコマンド間の実行順序が同時か順次かを示します。

    &非同期リストの各コマンドの後に&

    ;順次リストの最後のコマンドには以下が必要ないため、単項のようには見えません;

    注:演算子はオペランドに対して機能します。オペランドの数によって演算子は単項、二進…と言えます。私が正しく理解した場合、制御演算子はコマンドの演算子です。

  2. &と混合リストのコンポーネントコマンド;間の実行順序は何ですか?コンポーネントコマンドのそれぞれと&の意味は何ですか?;

    たとえば、バッシュでは

    $ echo 1 ; echo 2 & echo 3; echo 4 & echo 5
    1
    [1] 11089
    3
    2
    [2] 11090
    5
    4
    [1]-  Done                    echo 2
    [2]+  Done                    echo 4
    
    $ echo 1 ; echo 2 & echo 3; echo 4 & echo 5 ; echo 6 &
    1
    [1] 11100
    3
    [2] 11101
    5
    [3] 11102
    6
    4
    2
    [1]   Done                    echo 2
    [2]-  Done                    echo 4
    [3]+  Done                    echo 6
    

答え1

  1. 私は一般的にそれらを「オペレーター」とは思わない。私の言葉は、通常、演算子は値を返すということです。&どちらもありません;。代わりに、彼らは声明を終了します。しかし、それらを演算子として考えると、単一のステートメントに対して機能するため、後続の単項演算子になりそうです。

  2. 彼らは左から右から始まります。の場合、&バックグラウンドで非同期的に実行されます。echo 1 & echo 2 & echo 31、2、3は順序に関係なく印刷できます。ここに行く順番に、カーネルは順番に印刷するように予約しないことがあります。ただし、echo 1; echo 2; echo 3常に数字順に印刷されます。echo 1; echo 2 & echo 31は常に最初に印刷されますが、2と3は順序に関係なく印刷できます。

答え2

derobertの回答に追加し、質問に含まれるコマンドを分析するには、次の手順を実行します。

echo 1 ; echo 2 & echo 3; echo 4 & echo 5 ; echo 6 &

これは疑似コードで次のことを意味します。

print 1 (and complete this step before continuing)

start a process in the background that will eventually print 2,
  and keep going as soon as the process has been *started*

print 3 (and complete this before continuing)

start a background process that will eventually print 4,
  and keep going as soon as it has started

print 5 (complete this before continuing)

start a background process that will print 6.

また、シェルへのすべてのコマンドは終了する必要があります(&または;改行、ファイルの終わり、または今すぐ考えていないもの)。そうでなければ、シェルはいつより多くの文字の読み込みを中断するべきかを知ることができません。コマンドは実際に走る注文する。

答え3

Bashには、コマンドラインの一般的なケースと非常によく似た組み込みコマンドがあります。この部分はスキップします。

ただし、通常、コマンドラインは、演算子ではなく特殊な句読点文字で区切られた一連のコマンドです。

コマンドは実行可能ファイルの名前です(PATH環境変数を介して検索可能)。コマンドを実行するために実行されるプログラムです。

コマンドの後には、コマンドに文字列として渡されるスペースで区切られた文字列が続きます。ただし、引数の一部として特殊句読点を使用するには、エスケープする必要があります(\'または引用符を使用)。

句読点には影響があります。

「<」、「>」などの特殊句読点は、コマンドの標準入力、出力、およびエラーを定義します。

'|'コマンドを終了し、対応する標準出力を次のコマンドの標準入力に接続します。

';'前のコマンドを実行し、完了するまで待ちます。つまり、前景で実行されます。

'&'前のコマンドを実行しますが、完了するまで待たずにコマンドラインプロセスを続行します。つまり、バックグラウンドで実行されます。

したがって、これらの構文タグの目的は、これらの項目を一緒に使用して次のことを可能にすることです。

echo perl myperlprogram.pl \< mydata.txt | at 12:35

他のシェルコマンド自体を使用してechoPerlプログラムを実行するための文字列を生成し、at後でバッチジョブとして実行するために文字列をコマンドに送信します。ただし、これはエスケープされているため、標準入力をすぐに設定するのではなく(入力として送信する)引数<として渡されます。バッチシステムは、THENコマンド文字列を実行するときにPerlプログラムの標準入力を設定します。echoat

組み込みコマンドや括弧などの詳細なガイドラインがあり、基本を理解することで学ぶことができます。

関連情報