bash - 不污染自己命名空间的源代码[以安全的方式从其他脚本获取变量]

MCH*_*MCH 6 bash shell-script

我想将另一个 bash 脚本的变量内容分配给调用脚本中的变量。

具体来说,我source这个文件:https : //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[@]}")"
...
Run Code Online (Sandbox Code Playgroud)

所以基本上,每个语句启动它自己的子shell其源文件和打印的内容只是一个变量在父shell变量。

是否有另一种方法只涉及启动一个 SINGLE subshel​​l,获取文件的来源并获取分配给调用 shell 中指定变量的文件的指定变量的内容,而不会污染调用 shell的环境?

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

由于 Mark Mann 指出了source-ing 外国脚本的危险,我最终找到了另一个解决方案。除了source用于获取另一个脚本的变量之外,还可以使用grep带有perl正则表达式的多行来grep 文件中所有需要的变量 (varName=(...),varName2="...",varname3='... ',varName4=...) 和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
Run Code Online (Sandbox Code Playgroud)

unp*_*nic 10

使用eval.

如果您有源代码(在 /tmp/other.sh 中):

a=1
b=2
c=3
Run Code Online (Sandbox Code Playgroud)

并且您只需要一部分,您可以使用它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)"
Run Code Online (Sandbox Code Playgroud)

并运行它:

$ bash /tmp/main.sh
a is 1 (expect 1)
b is 2 (expect 2)
c is (expect nothing)
Run Code Online (Sandbox Code Playgroud)

警告:在不受信任的脚本上执行evalsource是非常危险的。您正在执行一个 shell 脚本,该脚本可以执行您自己可以做的任何事情。警告

  • 这仅在值不包含任何 shell 特殊字符时才有效。您可以使它健壮,但这需要一些努力。 (3认同)