shell 如何将环境变量传递给mongo脚本

drkbr07n  于 2023-02-24  发布在  Shell
关注(0)|答案(6)|浏览(217)

我想把名为file_path的环境变量传递给js文件。
我使用以下语法:

mongo --eval "var file_path='$file_path'" < aggregation.js

输出:

MongoDB shell version: 3.2.9-rc0
connecting to: test

注:

它不执行aggregation.js文件,只传递参数。

r1zhe5dt

r1zhe5dt1#

这对我很有效:

mongo --eval "var my_var = '$MY_VAR'" my_script.js

忽略<mongo会将命令行上的任何剩余参数作为要执行/解释的文件处理,但显然,将shell输入重定向与--eval结合使用会导致javascript名称空间被重置。
我假设但不能确认这是因为作为参数传递的文件名是通过load()机制处理的,根据https://docs.mongodb.com/v3.2/reference/method/load/,该机制的行为如下:
用load()执行文件后,可以从mongoshell环境引用该文件定义的任何函数或变量。

djp7away

djp7away2#

根据这个提交,似乎有一个名为_getEnv()的原生方法可以为您完成此操作。

const username = _getEnv('DB_USERNAME')
const password = _getEnv('DB_PASSWORD')
// use the username and password
2w2cym1i

2w2cym1i3#

自从Mongo 4.0.5以来,可以使用一些新的管理函数来加载文本文件和执行程序,因此您可以编写一个Javascript函数来执行提供环境变量值的shell脚本:

function getEnvValue(envVar, defVal) {
   var ret= run("sh", "-c", `printenv ${envVar} >/tmp/${envVar}.txt`);
   if (ret != 0) return defVal;
   return cat(`/tmp/${envVar}.txt`)
}

然后像这样使用它:

db.createCollection("myCol",
 { capped: true,
   size: getEnvValue('MYCOL_MAX_SIZE_GB', 2)*1024*1024*1024
});

这依赖于主机shell,但在我的情况下(Docker)是可以接受的。
还尝试直接读取environ

cat('/proc/self/environ').split('\0') # Doesn't work

但它只得到第一个变量我猜是因为空字符的缘故...

35g0bw71

35g0bw714#

看起来本地方法shellGetEnv()同时被添加,请参见MongoDB GitHub
函数可用(感谢@orgads):

_getEnv("PATH")

但是,它没有文档记录,并且存在no statement yet,无论它是否可由最终用户使用或仅作为内部命令使用。
新的MongoDB Shell mongosh是一个功能齐全的JavaScript和Node.js 14.x REPL环境,因此您可以使用process.env访问环境变量,例如

process.env["PATH"]
kxe2p93d

kxe2p93d5#

mongo change request给出了一个建议:

alias mongo="export | sed 's/declare -x /env./' > shell.js; mongo $@; rm shell.js;"

然后在~/mongorc.js中:

var env = {};
load('shell.js');
pdsfdshx

pdsfdshx6#

如果是Mongo 6,则使用process.env

$ export A='a"a'
$ mongosh --quiet --eval 'console.log(process.env.A)'
a"a

在6.x之前:

$ q_A=`jq --arg v "$A" -n '$v'`
$ mongosh --quiet --eval "console.log($q_A)"
a"a

顺便说一下,mongo映像(docker)附带了jq,尽管这可能会改变。

相关问题