0

私が持っているとしましょう

  • A.bash別のスクリプトを呼び出すbash スクリプトB.bash
  • B.bash変数を計算しますVAR
  • ここで、呼び出しスクリプトB.bashに戻りたいと思います。VAR

エクスポート VARB.bash、でソース できます。別の解決策は、 でエコーし、 で実行し、戻り値を として取得することです。B.bashA.bash VARB.bash B.bashA.bashR=$(B.bash)

それは理にかなっていますか?どちらのオプションが優れていますか? 代替手段はありますか?

4

3 に答える 3

2

慣例により、シェル スクリプトは、成功した場合は 0 を返します。それ以外の場合はゼロ以外です。

あなたの最善の策は、シェル変数を介してこれを渡すことです。

A.bash:

unset VAR
source B.bash
echo $VAR

B.bash:

export VAR=value
于 2013-01-21T16:18:54.783 に答える
1

bash 関数を使用するときは、次のようにします。

function myfunc()
{
    local  myresult='some value'
    echo "$myresult"
}

result=$(myfunc)   # or result=`myfunc`
echo $result

それが役立つことを願っています。

于 2013-01-21T16:17:20.320 に答える
1

少し紹介

追跡フォーク ( など$()) は、通常の (シーケンシャル) 実行よりも多くのリソースを消費するため、事前に変更する必要がある変数がわかっている場合は、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/sleep1/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 疑似ファイルシステムであっても) を介して関数にアクセスするには時間がかかります。

私の答え

  1. はい、それは理にかなってい$(...)ます...が、継承しない多くのバリアブルを含むバイナリコマンドまたはその他の強力なスクリプトの結果を返すのに役立ちます。
  2. あなたの必要性と各部分を書いた人に応じて...並列処理...その他の要因...
  3. 動的コマンドの他の代替手段は、実際にはそうではありませんが、可能な場合は、またはなどの組み込みを使用することをお見逃しなく。mapfileread -a

免責事項

この懸念はのみです!スクリプトを移植可能にしたい場合(bashほとんどの重要な OS に既に移植されている場合でも)、配列変数zshを使用せずに、またはを使用してスクリプトを試す必要がありますdash

于 2013-01-21T21:33:53.663 に答える