UNIXシェルはなぜですか?どうすれば解決できますか?

UNIXシェルはなぜですか?どうすれば解決できますか?

BASHや他のUNIXシェルについて私が気づいたことの1つは、基本的にそして一般的な方法で使用されるとき、ほとんどすべてのものに対してサブシェルを作成することです。

例えば

foo=$(grep "someword" /path/to/somefile | awk '{print $3}')

いくつかのテキストを変数にロードするために、2つの新しいbashセッションが作成されます。

a) シェルがなぜこのようなことをするのか?コマンドラインプログラムがファイルディスクリプタで動作している場合、ディスクリプタを提供するために新しい非対話型シェルセッションを作成する必要はありません。そうですか?

b)コマンド出力を変数にロードするときにこの問題を解決するための最良の方法は何ですか? Bashで次のことができることを知っています。

read -r -d '' < <(...)

サブシェルを使わずにコマンドで変数を設定することは可能ですが、これは非常に面倒で、より良い(そしてより移植性の高い)方法を探しています。 (言い換えれば、パイプとコマンドの置き換えの一般的な代替案を知っている人がいる場合は本当に良いでしょう。いいえサブシェルが関連しています。 )

注:「Perl / Python / Rubyユーザー」は「正しい」ソリューションである可能性がありますが、これらのソリューションにはファイル操作、外部コマンド呼び出しなどに多くの定型句コードが必要になる傾向があります。

編集:以下の回答に感謝します。ただし、プロセスの交換が新しいシェルをフォークする必要がある理由はまだ説明されていません。組み込みコマンドの場合でも:

$ builtin echo $(builtin echo $(builtin echo $BASH_SUBSHELL))
2

ベストアンサー1

grepあるいは、同じコマンドを実行するにはawkシェルを分岐する必要があります。つまり、サブシェルを取得します。唯一の例外は、コマンドが組み込みコマンドの場合、またはコマンドが最後のコマンドの場合です。ただし、後者の場合は、動作を変更できる特定の条件(既存のトラップなど)では実行できない一部のシェルによって実行される最適化のみですexec。したがって、2つのサブシェル

foo=$(grep "someword" /path/to/somefile | awk '{print $3}')

サブシェルを防ぐにはいくつかの回避策があり、状況に応じて見つける必要があります。

おすすめ記事