端末で次のコマンドを実行すると、期待どおりに機能します。
/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
|
inはMEH
参照されているように使用されます(つまり、プログラムにパラメータとして渡されます)。
echo duh | cat
たとえば、実験して、どのように機能するかを確認できます。
同様のアプローチに固執する場合は、次のことを試すことができますeval
。
eval $MEH
(本質的にeval
引用するかどうかはあまり問題にならないようです$MEH
。)