単純なコマンドの定義を理解する方法は?

単純なコマンドの定義を理解する方法は?

POSIX 2013では:

「簡単なコマンド」は、一連のオプションの変数割り当てとリダイレクト、順序に関係なく、オプションで次の単語とリダイレクト、制御演算子によって終了します。

Bashのマニュアルから:

単純なコマンドは、最も一般的に使用されるコマンドです。これは単にスペースで区切られた単語であり、シェルの制御演算子の1つで終わります。

私はPOSIX定義がBash手動定義よりも優れていると思います。しかし、POSIXの定義についてはまだよくわかりません。

  • 私が正しい場合、単純なコマンドの終了制御演算子はそのコマンドに属していませんか、それとも属していますか?

  • 定義の2つの「リダイレクト」は単純なコマンドですか?

  • 「一連のオプションの変数割り当てとリダイレクト」で変数を割り当てた後、「リダイレクト」は何をしますか?変数の割り当てはstdoutやstderrには書き込まれません。そうですか?

  • 「任意の順序でオプションの変数を割り当ててリダイレクトするシーケンス」では、「どの順序でも」とはどういう意味ですか?

  • この定義は、単純なコマンドに対してどのくらいの可能性を示唆していますが、その可能性は何ですか?

  • POSIXとBashの単純なコマンドの概念は同じですか?

答え1

Gregの答えに追加:

  1. うん、グループリダイレクト 同じ単純なコマンドに属します。

    入力(stdin)と出力(stdout)がリダイレクトされ、コマンドを実行するときは次のようにします。

    cmd パラメータ1   パラメータ2  <ファイル1  >ファイル2

    一部の人(少数)は次のように主張します。

    <ファイル1 cmdパラメータ1   パラメータ2  >ファイル2

    入力を指定する方が直感的だと信じているため、変更されます。それから行動、そしてそれから出力。しかし、以下はすべて同じです。

    <ファイル1  >file2 cmd パラメーター1   パラメーター2
    >file2 cmd パラメーター1   パラメーター2  <ファイル1
    ガイドライン  >ファイル2パラメータ1  <ファイル1パラメータ2

    いいえ上記の方法のいずれかを使用すると悪い例になります。

    重要なのは、リダイレクトがコマンドの最初の単語(またはコマンドのすべての単語)の前または後に表示される場合がありますが、同じ方法で処理されることです。

  2. 環境変数がそのコマンドの期間(範囲)の間にのみ設定されるように、コマンドの前に変数割り当てが表示されることがあります。例えば、

    TZ=GMT0 ls -l

    修正時間(GMT)を表示してファイルを一覧表示します。 「順序に関係なく、オプションの変数の割り当てとリダイレクト」は、

    TZ=GMT0 ls -l > ls_output_file
    TZ=GMT0 > ls_output_file ls -l
    > ls_output_file TZ=GMT0 ls -l

    すべて同じです。また、いいえ最初のものを除いて何かを使用してください。

    変数の割り当てに焦点を当てます。できないコマンドの最初の単語の後に表示されます。もしそうなら、コマンドの引数として扱われます。たとえば、構文を見てくださいdd

    変数の割り当てはstdoutやstderrには書き込まれません。そうですか?

    単純で継続的なデータ割り当ては何もしません(シェル内の履歴は含まれません)。ただし、コマンド置換はコマンドを実行します。CURRENT_DATE=$(date +%Y%m%d) コマンドを実行すると、date +%Y%m%d 標準出力がシェルのパイプにリダイレクトされ、シェルは出力をキャプチャしてコマンドラインに含めます。ただし、コマンドの標準エラーはdate依然としてシェルの標準エラーです。と言うと、日付指定構文はサポートされていないOLD_DATE=$(date --date"three days ago")ため、画面にエラーメッセージが表示されます。dateもちろん言えば抑制できますが、

    OLD_DATE=$(date --date "3日前" 2> /dev/null)

    しかし、そう言えばそうではありません。

    OLD_DATE=$(date --date "3日前") 2> /dev/null

    または

    2> /dev/null OLD_DATE=$(date --date "3日前")
  3. 「どんな順序でも」とは、私が最後に述べた内容と一緒に次の事実を意味します。

    TZ=GMT0 列=132 ls -l

    等しい

    列=132 TZ=GMT0 ls -l

    (異常な場合があります。そこまで行く危険はありません。)

答え2

bash の手動定義は少なくとも簡単です。リダイレクトは、コマンドの種類とは無関係ですが、関連する機能です。リダイレクトは、リンクされた特定のコマンドに影響を与えるという点でコマンドですが、複雑なコマンド(サブシェル、グループ、またはパイプ)でも発生する可能性があります。 POSIX 定義は小さな空間に多くの概念を含んでおり、bashマンページのように分離すると理解しやすくなります。それでも…

  • 終了制御演算子はコマンドの一部ではなく、単純コマンドを他の単純コマンドと区別します。

  • リダイレクトは単純なコマンドであり、複数を持つことができます。

  • ディスクリプタのコピーを開始するときの順序は重要ですが、リダイレクトはコマンドテキストとは多少独立しています。あなたの例では、この概念をスキップします。

    a=5 5> out5.file some-command > out.file arg1 2> out2.file arg 3> out3.file

    動作する簡単なコマンドになります。リダイレクトはパラメータ間に配置でき、順序に関係なく表示できます。

  • どのくらいの可能性がありますか?ここで何を尋ねているのか分かりません。多くのコマンドと無制限のパラメータの組み合わせ、さまざまなリダイレクトがあるため、可能性が高いです。

  • はい、同じです。しかし、POSIXはリダイレクトの概念を定義に混在させました。

マニュアルbashページは素晴らしいリソースです。しかし、私のお気に入りのリソースはGNUです。バッシュリファレンスマニュアルGNU.orgのウェブサイトから。それは良い進歩でよく書かれており、ほとんど繰り返されません。これについて詳しくは、簡単なコマンド定義とリダイレクトのセクションをご覧ください。

答え3

発生する問題を解決するには:

単純なコマンドの終了制御演算子はそのコマンドに属しません。そうですか?

まあ…いいえ。しかし、これは「簡単なコマンド」を定義する構文の一部です。適切な制御区切り文字を持たない「簡単なコマンド」は、シェルで正しく認識されません。
コマンドの実行時に区切り文字制御文字を実行するかどうかを尋ねる場合は、次のようにします。いいえ。区切り文字は実行されたコマンドの一部ではありません。

定義の2つの「リダイレクト」は単純なコマンドですか?

技術的にはそうではありません。リダイレクトはコマンドが実行される環境に影響を与えるため、コマンドの「正確な」部分ではありません。ただし、技術的には、環境を変更して実行されるコマンドに影響を与えます。

したがって、誰かが「一種の」と言うことができます。

「一連のオプションの変数割り当てとリダイレクト」で変数を割り当てた後、「リダイレクト」は何をしますか?変数の割り当てはstdoutやstderrには書き込まれません。そうですか?

こんな、一口ですね。これをいくつかの部分に分けてみましょう。

変数を割り当てた後、「リダイレクト」は何をしますか?

以前と同じで、中間、終了、またはコマンドライン全体の一部にある可能性があります。つまり、場所はリダイレクトの動作に影響を与えません。

注:リダイレクト順序自体がコマンドに与える影響を変更します。簡単に言えば、それは>file 2>&1同じではありません2>&1 >file。だから注意してください! 。

あなたは読むことができます:

  1. シェルの「2>&1」とはどういう意味ですか?
  2. 8.13 「2>&1 file」ですか、それとも「>File 2>&1」ですか?なぜ?

「オプションの変数の割り当てとリダイレクトの順序」で?

ここでの選択肢は、1つ、2つ、... 5つなどがある可能性があることを意味します。または
コマンドラインにはリダイレクトや変数の割り当てがない可能性があります。
「オプション」です。

変数の割り当てはstdoutやstderrには書き込まれません。そうですか?

いいえ、もちろんそうではありません。シェル変数の値のみが変更されます。
そして、コマンドの前に来ると、通常はコマンド環境に影響を与え、コマンドが終了すると変更が折りたたまれます(通常)。

「任意の順序でオプションの変数を割り当ててリダイレクトするシーケンス」では、「どの順序でも」とはどういう意味ですか?

左から右の順番が順番です。いいえ。割り当ておよび/またはリダイレクトを任意の順序で配置することはまったく同じではありません。
簡単に言うと、99.99%の時間に変数の割り当てが必要です。今後注文する。上記のように、リダイレクトの内部順序は重要です。リダイレクトはどこにでも(使用されている制御文字の制限内で)配置できます(ただし、使用はお勧めできません。コマンドラインを読むのは混乱しているため)。

単純なコマンドの場合、定義がどれだけの可能性をもたらすか、

可能性?無限。たとえば、次のようにします。

  1. すべてのオプションの重複はありません(少ない)。
  2. 可能なコマンド名:10(一度に1つだけ選択)。
  3. 可能なリダイレクト:5個(例:デフォルトのリダイレクトは10個、可能なファイル記述子は最大99個まで可能な場合が多い)10個のうち5個を選択します(順序が重要)。
  4. 可能な引数:20個の可能なオプションのうち3つを選択します(コマンドの順序は重要ですが、必ずしもそうではありません。オプションの最小数を選択し、順序は重要ではないとします)。
  5. 変数の割り当て?可能な変数10個のうち3個を選択してみましょう。 (はい、非常に低い数字です)。

    1C10*5P10*3C20*3C10=10*10!/(10-5)! * 20!/(((20-3)!*3!) * 10!/((10-3)!3!) = 41,368,320,000

私の計算が正しい場合。それはいいえ混ぜることができる言葉を数えてください。ちょうどKISS計算です。

とにかく、それは途方もない選択です。

彼らは何ですか?

短い答えでリストすることはできません。しかし、可能であってもそれほど価値がありますか?

正直言って、ティム、レモンの最後の一滴まで絞りようとしないでください。確かに健康に良くないと思います:-)。ちょうど言うよ!

POSIXとBashの単純なコマンドの概念は同じですか?

おそらくそうです(通訳者が使用する言語による違い)。繰り返しますが、最後の一滴まで絞り出そうとする価値はありません。

関連情報