私の質問は二重です。
初め:
サブシェルを使わずにこれを達成することは可能ですか?
FOO=$((6-5))
またはこれ?
BAR=`echo "$FOO/100" | bc -l`
2 つ目を正しく理解していれば、'と|を使用して 2 つのサブシェルを作成しています。
2番
この種のサブシェルを作成/使用すると、スクリプトの全体的なパフォーマンスに影響しますか?
- ありがとう
その単純な行で割り当てられたサブプロセスの数を確認できます。
bash -c 'echo $$'
新しいシェルを作成し、現在のプロセス ID を出力します。
Linux のプロセスは連番であるため、この「ハック」を使用して、コマンド間で開始されたプロセスの数を検出できます。(一部のプロセスは cron または at によってバックグラウンドで開始できるため、結果を複数回確認する必要があります)。
また、このコマンドはプロセスを開始するため、複数回開始すると、数が増加します。このコマンドの間に開始されたプロセスの実際の数を取得するには、1 を引く必要があります。
というわけでチェック開始。
$ bash -c 'echo $$'
4240
$ FOO=$((6-5))
$ bash -c 'echo $$'
4241
4241 - 4240 - 1 = 0
. サブプロセスは開始されませんでした。
$ FOO=1111
$ bash -c 'echo $$'
4244
$ BAR=`echo "$FOO/100" | bc -l`
$ bash -c 'echo $$'
4248
4248 - 4244 - 1 = 3
. 3つのプロセスが開始されました。
「ここに文字列があります」から始めると、無駄なエコーが削除されます。
$ bash -c 'echo $$'
4256
$ BAR=`bc -l <<< "$FOO/100"`
$ bash -c 'echo $$'
4259
4259 - 4256 - 1 = 2
. これで 2 つのサブプロセスが開始されました。
エコーが暗黙的に新しいシェルを割り当てるようです??
バックティックは新しいシェルを割り当てます-出力を読み取るための新しいプロセス
bc は新しいプロセスを割り当てます
このバリアントは、2 つのサブプロセスも作成します。
read BAR < <(bc -l <<< "$FOO / 100")
read は bash コマンドです。サブプロセスを fork せず、同じシェルで実行します
() はシェルを作成します - サブプロセス
bc はサブプロセスを作成します