
特に&を使用して呼び出すと、bashスクリプトの関数呼び出しはバックグラウンドで実行されますか?
解決策を講じようとしています。複数のファイル所有者の変更次のようなことがうまくいくと思いました。しかし、user_searcher()関数呼び出しは実際にバックグラウンドで実行されますか?
1 #!/bin/bash
2
3 User1=1000
4 User2=1001
5 User3=1002
6
7 user_searcher()
8 {
9 for fil in `find $HOME -uid $ooser -type f`
10 do
11 chown "NEWUSER$1" $fil
12 done
13 }
14
15 PIDARRAY=()
16 let i=1
17 for ooser in $User1 $User2 $User3 ;
18 do
19 let i++
20 user_searcher ooser i &
21 PIDARRAY+=("$!")
22 done
23
24 wait ${PIDARRAY[@]}
答え1
man bash (ジョブ制御を参照)
& は制御演算子で、制御機能を実行するという意味です。
コマンドが制御演算子&によって終了すると、シェルはサブシェルのバックグラウンドでコマンドを実行します。
(サブシェルにはPIDプロセスID番号が割り当てられます)
簡単に言うと、コマンドを&で終了すると、コマンドを実行するためのサブシェルプロセスが作成され、すべてのコマンドがバックグラウンドで実行されるように指示できます。
おおまかに言えば、シェルで独立して実行できる場合は、サブシェルでもバックグラウンドで実行できます(&
何をするか)。もしあれば十分サブシェルで一連のコマンドまたは完全なコマンド(関数)を実行してからバックグラウンドで実行できます。変数の範囲はさまざまでカスタマイズ可能なバックグラウンド実行です(coproc
vs&
との比較を参照してくださいlastpipe
。変数の範囲は、コマンドがサブシェルで実行されているためではなく、サブシェルで実行されたコマンドの結果です)。背景)。
コマンドとは何ですか?
~からウルウィッチカーニバルガイド:
BASHは入力(通常は端末またはファイル)からコマンドを読み取ります。読み取る各入力行は、命令、すなわち実行される命令として扱われます。 (後で説明する複数行にわたるコマンドなどのいくつかの高度なケースがあります。)Bashは、各行をスペース文字(スペースとタブ)で区切られた単語に分割します。行の最初の単語は、実行するコマンドの名前です。残りのすべての単語はコマンドの引数(オプション、ファイル名など)になります。
bash-doc-3.2のaosa-bash-full.pdfバッシュソースコード:
「単純な」シェルコマンドは、コマンド名(例:echoやcd)とゼロ個以上の引数とリダイレクトのリストで構成されています。 (47ページ)
シェル関数とシェルスクリプトは、コマンドセットの名前を指定し、他のコマンドと同様に、そのコマンドセットを実行する方法です。シェル関数は特別な構文を使用して宣言され、同じシェルコンテキストで保存および実行されます。シェルスクリプトは、ファイルにコマンドを配置し、それを解釈するためにシェルの新しいインスタンスを実行することによって生成されます。シェル関数はそれを呼び出すシェルとほとんどの実行コンテキストを共有しますが、シェルスクリプトは新しいシェル呼び出しとして解釈されるため、環境内のプロセス間で渡される内容のみを共有します。 (48ページ)
.........
Bashは基本的に、1つ以上のプロセスで実行されるコマンドであるタスクの概念を導入しました。たとえば、パイプはパイプの各要素に1つのプロセスを使用します。プロセスグループは、個々のプロセスを単一のタスクにリンクする方法です。端末は関連するプロセスグループIDを有するので、フォアグラウンドプロセスグループは、端末プロセスグループIDと同じプロセスグループである。 (69ページ)
- すべてのプロセスがバックグラウンドで実行可能
- シェル自体が一つのプロセスである
- シェルのすべてのディレクティブ/コマンド(まだ緩く定義されている)は、&によって生成されたサブシェルで実行することによってバックグラウンドで実行できます。
最大の考慮事項は、バックグラウンドサブシェルプロセスが親プロセスと対話する方法です。再び man bash のジョブ制御を参照してください。