export_to_disk() {
local export_to_disk__filename=$1; shift || return
local export_to_disk__varname
for export_to_disk__varname in "$@"; do
printf '%s=%q\n; export %q\n' "$export_to_disk__varname" "${!export_to_disk__varname}" "$export_to_disk__varname"
done
}
1条答案
按热度按时间nnt7mjpx1#
eval
是一个unnecessary source of security risks,强制export
意味着你的代码没有正确地保留变量的原始标志(实际上可能会也可能不会导出)。让shell本身负责序列化变量,使同一shell能够成功地反序列化它:
...但更聪明的调用约定是将文件名作为 first 参数,因此所有后续参数都被视为变量序列化到该文件中:
也就是说,如果你真的想只支持可以导出的字符串类型变量(失去对数组和c的支持),你可以在没有
declare -p
的情况下做到这一点:让我们把它分解一下:
export_to_disk__
开头的长变量名来防止冲突:如果我们把它叫做简单的名字,比如var
,那么这个程序就不能用来保存一个名为var
的变量。使用我们自己的变量命名空间会使这个函数更冗长,但也会使它更强大。shift
,所以它被从参数列表中删除,所以当我们稍后迭代剩余的参数时,它不再出现在"$@"
中。printf %q
时,我们正在生成变量值的一个 * 评估安全 * 版本,即使是故意恶意或危险的变量名也可以防止安全问题。(因为我们使用printf %s
作为变量 name,不是真正有效的变量名的东西可能会导致生成不安全的代码;因此,如果您正在查找此命令运行的代码,则应确保您信任名称,即使您不信任值)。