我正在尝试自动执行以下一系列可以在BASH脚本中正常运行的命令:
kubectl exec -it mongo-pod -- bash
mongo DBNAME
db.auth("theUser", "thePw")
db.theCollection.find()
我正在使用的脚本如下:
#!/bin/bash
kubectl exec -it mongo-pod -- bash -c "mongo DBNAME && /
db.auth("theUser", "thePw") && /
db.theCollection.find()"
我尝试了以下方法: Executing multiple commands( or from a shell script) in a kubernetes pod 但是在第一次使用&或&&之后添加的任何命令都不会执行。例如,仅使用“ mongo DBNAME”可以正确打开提示并将其设置为正确的数据库,但是使用&&添加任何其他命令会导致所有命令失败,并显示以下内容:
bash:-c行0:意外令牌'theUser'附近的语法错误
答案 0 :(得分:0)
所有评论都应有尽有,但至少有两件我最有信心的答案:
首先,您将换行符设置为错误;应该是\
,而不是/
。实际上,如果您使用b
kubectl exec -it mongo-pod -- bash -ec "mongo DBNAME
echo 'this command only runs if mongo exits a-ok'
exit 1
and this never will run
"
但是,另一个错误是使用引号引起的:如果您使用bash -c "
,则必须对内部字符串文字使用单引号,或者使用\"
对其进行转义。通过查看问题中shell片段的语法突出显示,您实际上可以看到我在说什么。观察到字符串文字是红色的,但随后的文本theUser
和thePw
都是黑色的-这是因为它们在字符串文字之外,因为字符串在第一个"
处停止了它遇到了-db.auth("
在大多数情况下,这样远程远程调用bash时,您总是要使用单引号,这是出于几种原因,但最相关的是您可以使用db.auth("something")
不必不必要地转义双引号。
由于mongo
(像许多解释器,例如node
和python
)希望您以交互方式键入它,在其“标准输入”上提供输入,或者给它一个包含命令的本地文件,您将需要根据需要将调用更改为这些策略之一。
一种无需使用echo
或printf
及其相关的引号地狱而重定向标准输入的非常方便的方法是在bash中使用所谓的"here documents" (abbreviated "heredocs"):
kubectl exec -it mongo-pod -- bash -ec 'mongo DBNAME<<"FOO"
db.auth("theUser", "thePw")
printjson(db.theCollection.find())
FOO
'
这导致bash将两个“ heredoc定界符”之间的几乎所有字符都传输到命令的标准输入。如果像我用[任意]词FOO
那样引用定界符,则内容将不受变量扩展,命令插值等的影响,这可以成为避免反引号和美元风格怪异的另一种机制。 / p>