敗戦で鶏が最初か卵が最初かという奇妙な質問

敗戦で鶏が最初か卵が最初かという奇妙な質問

このbashコマンドのいくつかのステップはどの順序で完了しますか?

(flock -n 9) 9> toto.txt

サブシェル部分のみを実行する場合:

(flock -n 9)

私は次の結果を得ました:( flock: 9: Mauvais descripteur de fichier間違ったファイル記述子)。

したがって、サブシェルが最初に(...) 9> toto.txt

しかし、これを行うと:

(ls -l /proc/$$/fd) 9> toto.txt 
total 0
lrwx------ 1 laurent laurent 64 déc.  16 00:24 0 -> /dev/pts/2
lrwx------ 1 laurent laurent 64 déc.  16 00:24 1 -> /dev/pts/2
lrwx------ 1 laurent laurent 64 déc.  16 00:24 2 -> /dev/pts/2
lrwx------ 1 laurent laurent 64 déc.  16 00:24 255 -> /dev/pts/2

ファイル記述子9はリストされません。それでは、群れがそれを開く責任があると思いますか?

サブシェルの内部と外部の間の「ハンドシェイク」ステップとその順序を説明できる人はいますか?

ベストアンサー1

比較は次のとおりです。

sh -c 'ls -l /proc/$$/fd' 9>/tmp/toto.txt
total 0
lrwx------ 1 chris chris 64 Dec 16 11:24 0 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 1 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 2 -> /dev/pts/0
l-wx------ 1 chris chris 64 Dec 16 11:24 9 -> /tmp/toto.txt

sh -c "ls -l /proc/$$/fd" 9>/tmp/toto.txt
total 0
lrwx------ 1 chris chris 64 Dec 16 11:24 0 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 1 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 2 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:25 255 -> /dev/pts/0

( ls -l /proc/$$/fd ) 9>/tmp/toto.txt        # Your own example
total 0
lrwx------ 1 chris chris 64 Dec 16 11:24 0 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 1 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:24 2 -> /dev/pts/0
lrwx------ 1 chris chris 64 Dec 16 11:25 255 -> /dev/pts/0

最初の例では、$$サブシェルに属しています。 2回目の場合でも、お客様の状況に$$応じて親シェルコマンドが実行される前に。

今、元の質問に答えるには、

このbashコマンドのいくつかのステップはどの順序で完了しますか? (flock -n 9) 9> toto.txt

これはPOSIXで定義:

  1. シェルは、ファイル(shを参照)、-cオプション、またはPOSIX.1-2017システムインターフェースボリュームで定義されているsystem()およびpopen()関数から入力を読み取ります。シェルコマンドファイルの最初の行が「#!」文字で始まる場合、結果は指定されません。
  2. シェルは入力をトークンに分割します。単語と演算子については、トークン認識を参照してください。
  3. シェルは入力を単純なコマンド(単純コマンドを参照)と複合コマンド(複合コマンドを参照)に解析します。
  4. シェルは、各コマンドの異なる部分に対して(別々に)さまざまな拡張を実行し、コマンドと引数として処理されるパス名とフィールドのリストを生成します。
  5. シェルはリダイレクト(リダイレクトを参照)を実行し、引数リストからリダイレクト演算子とそのオペランドを削除します。
  6. シェルは、関数(関数定義コマンドを参照)、組み込み関数(特殊組み込みユーティリティを参照)、実行可能ファイル、またはスクリプトを実行して、1からnまでの位置引数の形式でパラメータ名とコマンド名を提供します。 (またはスクリプト内のスクリプト機能の場合)位置引数番号0として使用されます(コマンドの検索と実行を参照)。
  7. シェルは、オプションでコマンドが完了して終了ステータスを収集するのを待つことができます(コマンドの終了ステータスを参照)。

おすすめ記事