我想要一个启动控制台(即数据库 postgres 或 mongo)的脚本,并执行一些已知有效的命令,
解决方案之一是
file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)
cat file.sh | mongo <EXPECTED_COLLECTION>
感觉就像猴子补丁(当然它可以在另一个脚本中关闭)那么有没有更“专业”的方法来做到这一点?
答案1
cat file.sh | mongo …
是联合大学,<file.sh mongo …
更好。
附注:为什么.sh
? 或什么的都无所谓mongo
,但人们会期望file.sh
它是一个 shell 脚本。从现在开始我将使用file1
它。
man 1 mongo
给出一个例子:mongo script1.js script2.js script3.js
,所以我希望mongo … file1
也能起作用。
#!/path/to/mongo
或者#!/usr/bin/env mongo
可以用作舍邦。使用 中的 shebang file1
,使文件可执行(chmod +x file1
)并直接运行它(例如,通过输入./file1
其目录)。将其放置file1
在您指定的目录中PATH
,您只需调用 即可运行它file1
。
注意,shebang 指定一个解释器和最多一个附加参数。从技术上讲,你可以<EXPECTED_COLLECTION>
在后面添加一个参数(比如你的 )#!/path/to/mongo
(但不能在参数之后#!/usr/bin/env mongo
)mongo
,但我宁愿在 shebang 下面的 JavaScript 中执行所有操作。
您可以使用构造函数在 javascript 文件内指定 mongodb 连接参数
Mongo()
。
(来源)
psql
有点不同。解释脚本的基本方法是psql -f file2
(psql <file2
应该也可以,但看看man 1 psql
在描述的地方对此进行了说明-f
)。
如果忽略以 开头的行(例如 eg所做的那样),或者至少在第一行识别为 shebang 并跳过该行,则 shebang 类似#!/path/to/psql -f
会起作用。但不会。有一些技巧可以规避这种情况;请参阅psql
#
sh
#!…
为psql
。
上一个链接中的答案之一在 shell 脚本中使用了此处文档。这种方法非常强大。Bash 脚本中的 Python 脚本示例如下:如何在 bash 脚本中包含 python 脚本?类似地,您可以将嵌入脚本传递给mongo …
(或psql -f -
):
#!/bin/sh
mongo … << 'EOF'
db.EXPECTED_COLLECTION.remove("_id":1234)
EOF
如果你打电话这脚本file.sh
,那么该.sh
部分将不是容易引起误解。这是一个 shell 脚本。
注意<< EOF
,而不是<< 'EOF'
将允许你传递扩展变量从 shell 到mongo
。