少し紹介
追跡フォーク ( など$()
) は、通常の (シーケンシャル) 実行よりも多くのリソースを消費するため、事前に変更する必要がある変数がわかっている場合は、local
スクリプト全体で定義を使用し、ファイルを作成する代わりに関数を使用することをお勧めします。コマンド間のアクセス:
#!/bin/bash
# There is the `A` script
local VAR
function B() {
read -a VAR </proc/uptime
}
B
echo $VAR
sleep 1
B
echo $VAR
次のような出力が可能です:
1610291.39
1610292.39
アクセス時間は/bin/sleep
1/100 秒未満になる可能性があります。
ちょっとしたデモンストレーション:
local V1
B1() {
read -a V1 </proc/uptime
}
B1 ;echo $V1 ;for i in {0..10000} ;do B1 ;done ;echo $V1
1610843.78
1610844.38
printf "%d 1/100th of sec\n" $((161084438-161084378))
60 1/100th of sec
60/100 秒で 10000x の変数を設定できましたが、
B2() {
local var
read -a var </proc/uptime
echo $var
}
V2=$(B2);echo $V2;for i in {0..10000};do V2=$(B2);done;echo $V2
1611121.33
1611168.01
printf "%d 1/100th of sec\n" $((161116801-161112133))
4668 1/100th of sec
もっと時間がかかるかもしれません!
@alokが提案したように、本当にすべてを個別のファイルに保持したい場合は、source
フォークしないため、それらを使用できます。
echo >/dev/shm/B3 'read -a V3 </proc/uptime'
. /dev/shm/B3 ;echo $V3 ; for i in {0..10000};do . /dev/shm/B3;done;echo $V3
1612187.89
1612188.79
printf "%d 1/100th of sec\n" $((161218879-161218789))
90 1/100th of sec
これは、ループごとに fork するよりもはるかに高速ですが、ファイルシステム (アクセス時間のない RAM 疑似ファイルシステムであっても) を介して関数にアクセスするには時間がかかります。
私の答え
- はい、それは理にかなってい
$(...)
ます...
が、継承しない多くのバリアブルを含むバイナリコマンドまたはその他の強力なスクリプトの結果を返すのに役立ちます。
- あなたの必要性と各部分を書いた人に応じて...並列処理...その他の要因...
- 動的コマンドの他の代替手段は、実際にはそうではありませんが、可能な場合は、またはなどの組み込みを使用することをお見逃しなく。
mapfile
read -a
免責事項
この懸念はbashのみです!スクリプトを移植可能にしたい場合(bash
ほとんどの重要な OS に既に移植されている場合でも)、配列変数zsh
を使用せずに、またはを使用してスクリプトを試す必要がありますdash
。