터미널에서 다음 명령을 실행하면 예상대로 잘 작동합니다.
/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
.)