设想:我正在登录 docker 容器来恢复 mongodb 转储。该卷中只有一个转储文件。
如果我在文件名中使用通配符,则会出现以下错误,但如果我给出完整的文件名,它就可以工作。我花了几个小时搜索论坛但找不到答案。我的脚本中缺少什么?
root@141782f66c37:/data/backup# ./mongoretore.sh
./mongoretore.sh: line 2: dump_06-11-2020_20-32-15.dump: command not found
./mongoretore.sh: line 2: `*.dump`: ambiguous redirect
在职的
#!/bin/bash
mongorestore --drop --archive < dump_06-11-2020_20-32-15.dump
不工作
#!/bin/bash
mongorestore --drop --archive < `*.dump`
答案1
... < `*.dump`
这里重定向运算符后面的部分是命令替换,最好使用更现代的语法编写,如$(*.dump)
.它的内部是一个贝壳球。 glob 扩展所有以 结尾的文件名.dump
,然后将它们作为命令运行。
在您的情况下,如果它是唯一匹配的文件,则生成的命令dump_06-11-2020_20-32-15.dump
本身为 ,如果有其他文件,则其后带有其他文件名。无论如何,您的PATH
命令都不包含具有该名称的命令,因此 shell 会给出错误。然后它会给出另一个错误,因为重定向失败。可能是因为命令替换输出一个空字符串,所以就像做
x=
... < $x
现在的问题是,你想做什么?通常,您不会尝试使用普通的命令来运行工作目录中的文件*
,因为当前目录通常不位于 中PATH
,因此它不起作用。如果您只想读取已知名称的文件,则正确的语法是不带反引号,例如
... < filename.dump
或者,如果您不知道文件名,但知道只有一个文件名,则可以使用 glob:
... < *.dump
只要目录中只有一个匹配的文件,这一功能就可以工作。如果超过了,它会给出一个ambiguous redirect
错误,因为 Bash 无法知道你想从哪一个读取。
如果有多个文件,您需要决定如何处理它们。为每个文件运行一次命令,并依次从每个文件重定向输入?或者总共只运行该命令一次,并从其中一个文件重定向输入?但哪一个呢?