从脚本启动时 mysqldump 失败

从脚本启动时 mysqldump 失败

在终端中运行下一个命令工作正常,如预期的那样。

/var/www$ sudo mysqldump --defaults-extra-file=/mnt/./.sql/mysqldump.cnf --databases site3 --hex-blob | sudo tee /mnt/site3/20230404_site3.sql

从脚本中运行相同的命令

-rwx------ 1 root root 1686 apr  4 22:23 BackupDrupal.sh
/var/www$ sudo ./BackupDrupal.sh site3

以下一条消息结束:

/*!40000 ALTER TABLE `watchdog` ENABLE KEYS */;
UNLOCK TABLES;
mysqldump: Got error: 1049: Unknown database '|' when selecting the database

脚本:

#!/bin/bash  
#SCRIPT FOR BACKING UP THE DRUPAL FOLDER AND THE DRUPAL DATABASE
#the mysqldump and the whole drupal directory are placed on the  mounted /dev/sda11 parition

#For backing up site3 the script is launched like:
#$ sudo ./Backup_Drupal.sh site3


#define variables
NOW=$(date +"%Y%m%d")
TARGET_DIR="/mnt/$1"
TARGET_FILE=$TARGET_DIR"/"$NOW"_"$1".sql"
SOURCE_DIR="/var/www/"$1
RET=$(mount | grep "/dev/sda11")
ARR=( $RET ) 
#echo $NOW
#echo $TARGET_DIR
#echo $TARGET_FILE
#echo $SOURCE_DIR
#echo $RET
#echo ${ARR[0]}

#check if mounted / if not: mount /dev/sda11
if [ -z "$ARR" ] 
    then 
        echo -e "ARR is empty - /dev/sda11 not mounted ...\n"
        echo -e "Mounting now ... \n"
        mount -t ext4 /dev/sda11 /mnt
fi

#Look for 1st argument
if [ -z "$1" ] 
    then
        echo -e "An argument is needed to run this script. Launch like Backup_Drupal site99 ...\n"
                exit 1  
fi

#check path
if [ -d "$TARGET_DIR" ];
    then
            echo -e "Installing backup in  ${TARGET_DIR} ...\n"
else
        echo -e "Directory ${TARGET_DIR} does not exist ...\n"
            exit 1
fi

#mysqldump database
echo -e "Saving database ...\n"
#SQLDUMP="sudo mysqldump -u root -p --databases $1 --hex-blob | sudo tee $TARGET_FILE;"
SQLDUMP="sudo mysqldump --defaults-extra-file=/mnt/./.sql/mysqldump.cnf --databases $1 --hex-blob | sudo tee $TARGET_FILE"
$SQLDUMP
echo -e "the command used = $SQLDUMP \n"
echo -e "Database saved as $TARGET_FILE...\n"

#save drupal folder in tar.gz format
echo -e "Saving $1 folder in tar.gz format...\n"
TARGET_FILE=$TARGET_DIR"/"$NOW"_"$1".tar.gz"
tar -cpzf $TARGET_FILE $SOURCE_DIR
echo -e "$SOURCE_DIR saved as $TARGET_FILE...\n"
echo -e "All done...\n"

[参见:][1] [1]:https://unix.stackexchange.com/questions/741683/permission-denied-using-mounting-point-redirection-in-mysqldump

答案1

mysqldump:出现错误:1049:未知数据库“|”选择数据库时

这让我认为您对命令的输入没有被正确清理,也许以$1某种方式最终的值只是管道字符。您可以在脚本中打印变量的值来进行调试。

我还强烈建议您将脚本粘贴到https://www.shellcheck.net/并遵循建议,因为这将帮助您编写更好的 bash 代码。它还可以作为大多数 IDE 的插件提供。我尝试了一下,它指出了代码的多个问题,例如(可能)错误放置的引号会干扰变量扩展。

编辑:Tom Yan 的另一个答案在解释问题的原因方面做得更好,即在运行之前将包括管道在内的整个命令定义为变量。

答案2

当你做类似的事情时:

MEH="..."
$MEH

|inMEH将像被引用一样使用(即作为参数传递给程序)。

您可以用eg 进行实验,echo duh | cat看看它是如何工作的。

如果您坚持采用类似的方法,您可以尝试eval

eval $MEH

(鉴于其本身的性质,eval您是否引用可能并不重要$MEH。)

相关内容