他のbashスクリプトの変数の内容を呼び出しスクリプトの変数に割り当てたいと思います。
特に次のファイルがありますsource
。https://projects.archlinux.org/svntogit/packages.git/plain/trunk/PKGBUILD?h=packages/firefox(およびその他の類似文書)。
ファイルにはなどの変数が含まれていますdepends
。makedepends
だから私のスクリプトにはいくつかのステートメントがあります。
depends="$(source "/path/to/file" ; printf '%s' "${depends[@]}")"
makedepends="$(source "/path/to/file" ; printf '%s' "${makedepends[@]}")"
...
したがって、デフォルトでは、各ステートメントはファイルをインポートして内容を印刷する独自のサブシェルを起動します。単一の変数親シェルの変数に。
単一のサブシェルの起動に関連する他の方法はありますか?、ファイルをインポートし、呼び出しシェルで指定されたファイルに割り当てられた指定された変数の内容を取得します。シェルが呼び出される環境を汚染しませんか?
------------------------------------- ----------
Mark Mannが外国のスクリプトを使用する危険性を指摘したので、source
私は結局別の解決策を提案しました。source
これを使用して他のスクリプトの変数(varName =(...)、varName2 = "..."、varname3 = '...'、varName4 = ...)と結果を取得する代わりに:grep
perl
eval
$ 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
ことは非常に危険です。あなたはシェルスクリプトを実行しており、スクリプトはあなたが自分でできることをすべて行うことができます。警告する