我认为这是一个简单的问题,但我没有人可以仔细检查我的工作。
这是我的 bash 脚本
#!/bin/bash
# establish date format and dump name
DATE=$(date +"%Y%m%d-%H%M")
DUMPFILE=$DATE.dump
# path to log dir and name of output log file
LOGDIR=/opt/mongodb/backups/logs
DBLOG=$DATE-dump.log
# backup the database and output to a dump file, redirect output to a log
docker exec -i mongodb sh -c "mongodump --archive" > \
$DUMPFILE 2> \
$LOGDIR/$DBLOG
# archive the dump file and the file uploads
ARCHIVENAME=$DATE.tgz
ARCHIVELOG=$DATE-archive.log
tar -czvf $ARCHIVENAME /opt/mongodb/$DUMPFILE /opt/mongodb/files &> \
$LOGDIR/$ARCHIVELOG
在我遇到困难的地方,脚本正确地输出了转储日志。然而,当它结束时,我收到了
./backup.sh: line 20: /opt/mongodb/backups/logs/20250328-0942-archive.log: No such file or directory
我尝试使用绝对路径而不是变量:
tar -czvf $ARCHIVENAME /opt/mongodb/$DUMPFILE /opt/mongodb/files &> \
/opt/mongodb/backups/logs/$ARCHIVENAME
但我得到了同样的错误。我认为这要么是我对重定向、tar 理解不正确,要么是语法错误。如能得到任何帮助,我将不胜感激。
编辑:每次运行脚本时都会创建一个名为“' '”的文件。如果运行
cat ' '
我看到该文件是日志,因此它确实将输出重定向到文件,只是不是以期望的方式。
您很可能在最后一行的末尾有一个或多个空格字符,而该行的末尾应该有一个反斜杠字符。
通过反斜杠延续到下一行的行在反斜杠后不能有任何内容,甚至不能有空格。
由于反斜杠后有空格,因此该空格被引用,因此你实际上是在说
下一行尝试将不存在的日志文件作为命令运行。这就是生成“无此文件或目录”错误消息的原因。
我对您的脚本的看法包含我的个人偏好,同时也考虑了Paul_Pedant 在评论中关于引用和换行符的说法。
我猜你或你的编辑器在
\
该行后面放了一个空格,导致它重定向到\
(' '
)而不是文件。