bash - 独自の名前空間を汚染しないソースコード[他のスクリプトから変数を取得する安全な方法]

bash - 独自の名前空間を汚染しないソースコード[他のスクリプトから変数を取得する安全な方法]

他のbashスクリプトの変数の内容を呼び出しスクリプトの変数に割り当てたいと思います。

特に次のファイルがありますsourcehttps://projects.archlinux.org/svntogit/packages.git/plain/trunk/PKGBUILD?h=packages/firefox(およびその他の類似文書)。

ファイルにはなどの変数が含まれていますdependsmakedepends

だから私のスクリプトにはいくつかのステートメントがあります。

depends="$(source "/path/to/file" ; printf '%s' "${depends[@]}")"
makedepends="$(source "/path/to/file" ; printf '%s' "${makedepends[@]}")"
...

したがって、デフォルトでは、各ステートメントはファイルをインポートして内容を印刷する独自のサブシェルを起動します。単一の変数親シェルの変数に。

単一のサブシェルの起動に関連する他の方法はありますか?、ファイルをインポートし、呼び出しシェルで指定されたファイルに割り当てられた指定された変数の内容を取得します。シェルが呼び出される環境を汚染しませんか?

------------------------------------- ----------

Mark Mannが外国のスクリプトを使用する危険性を指摘したので、source私は結局別の解決策を提案しました。sourceこれを使用して他のスクリプトの変数(varName =(...)、varName2 = "..."、varname3 = '...'、varName4 = ...)と結果を取得する代わりに:grepperleval

$ grepvars='(license)|(depends)|(makedepends)|(url)|(pkgdesc)|(pkgver)'
$
$ eval $(grep -Pzo "^(${grepvars})=\([^\)\(\`]*\)|^(${grepvars})=\"[^\"\(\`]*\"|^(${grepvars})='\''[^'\'']*'\''|^(${grepvars})=[^\s;\(\`]*" /tmp/above_mentioned_file)
$ echo $url
https://www.mozilla.org/firefox/
$
$ echo ${depends[@]}
gtk3 gtk2 mozilla-common libxt startup-notification mime-types dbus-glib alsa-lib ffmpeg2.8 desktop-file-utils hicolor-icon-theme libvpx icu libevent nss hunspell sqlite ttf-font

ベストアンサー1

使用eval

ソースコードがある場合(/tmp/other.shに):

a=1
b=2
c=3

一部だけが必要な場合は、それを使用してevalアイテムをインポートできます(/tmp/main.shから)。

eval $(source /tmp/other.sh;
       echo a="$a";
       echo b="$b";)

echo a is $a "(expect 1)"
echo b is $b "(expect 2)"
echo c is $c "(expect nothing)"

そして実行してください:

$ bash /tmp/main.sh
a is 1 (expect 1)
b is 2 (expect 2)
c is (expect nothing)

警告する:信頼できないスクリプトを実行evalまたは実行するsourceことは非常に危険です。あなたはシェルスクリプトを実行しており、スクリプトはあなたが自分でできることをすべて行うことができます。警告する

おすすめ記事