Pregunta mysqldump a través del script bash que falla con "No existe tal archivo o directorio"


Esto me está conduciendo NUTS. Cualquier ayuda apreciada!

$MYSQLDUMP --login-path=$HOST $DATABASE > "$BACKUP_DIR/${HOST}__${DATABASE}__${NOW}.sql";
  • He confirmado que el binario $MYSQLDUMP (dentro del script) tiene una ruta completa válida
  • El comando está completo (confirmado a través de eco)
  • $NOW está establecido desde el principio en el script, y no aquí ... así que el tiempo no nos cambia ni nada.
  • Esto no se está ejecutando a través de cron
  • El usuario que ejecuta el script a través de la línea de comandos, también tiene acceso / permisos al directorio real
  • Intentó dos2unix para asegurarse de que no hay personajes extraños. Estoy en una Mac, pero oye ... ¿por qué no?
  • Intentó escapar de la > me gusta \>, que en cambio produce un mysqldump: Couldn't find table: ">" error

Esto me está volviendo loco. No estoy seguro de lo que me estoy perdiendo aquí? Solo estamos dirigiendo la salida, y siento que es algo ridículamente obvio que estoy pasando por alto.

ACTUALIZAR

Agregó algunas pruebas más para depurar y ayudar aquí.

vrb "\$BACKUP_DIR: $BACKUP_DIR"
vrb "whoami $(whoami)"
vrb "ls -ld \"$BACKUP_DIR/\" $(ls -ld \"$BACKUP_DIR/\")"
vrb "absolute path of user's home dir: $(cd ~/; pwd)"
vrb "absolute path of \$BACKUP_DIR: $(cd $BACKUP_DIR/; pwd)"

... produce ...

20160713T210808Z: $BACKUP_DIR: ~/www/__MYSQL/backup
20160713T210808Z: whoami william
ls: "~/www/__MYSQL/backup/": No such file or directory
20160713T210808Z: ls -ld "~/www/__MYSQL/backup/" 
20160713T210808Z: absolute path of user's home dir: /Users/william
./mygration.sh: line 383: cd: ~/www/__MYSQL/backup/: No such file or directory
20160713T210808Z: absolute path of $BACKUP_DIR: >> ERROR: 1

vrb es solo otra función que procesa una salida detallada en el script, así que no se alarme por eso. Es solo para dar salida a la información depurada.

Si enumero manualmente los contenidos en el mismo terminal para ~/www/__MYSQL/backup/, Puedo ver lo siguiente:

$ ls -la ~/www/__MYSQL/backup/
total 0
drwxr-xr-x  2 william  staff   68 Jul 13 20:55 .
drwxr-xr-x  6 william  staff  204 Jul 13 20:55 ..

Es raro. Casi como Bash no tiene acceso, pero mi usuario habitual (el que ejecuta el script de bash en primer lugar) sí.

Otra actualización

echo $(whoami);
echo ~;
exit;

... produce ...

william
/Users/william

6
2017-07-14 03:17


origen


Todavia no veo ls -ld ~/www/__MYSQL/backup/ lo que quizás podría darnos pistas ya que la situación se está volviendo más rara. - Julie Pelletier


Respuestas:


El problema es que has puesto la tilde entre comillas dobles. Cuando haces esto, es no ampliado a la ruta de su directorio de inicio.

Considerar:

MacBook-Pro:~ error$ cat x.sh
#!/bin/sh
echo ~
echo "~"
ls ~
ls "~"
MacBook-Pro:~ error$ ./x.sh
/Users/error
~
Calibre Library Downloads   Music       bin
Desktop         Library     Pictures    synergy
Documents       Movies      Public      x.sh
ls: ~: No such file or directory
MacBook-Pro:~ error$ 

Si desea continuar usando comillas dobles, use la $HOME Variable en lugar de la tilde.

MacBook-Pro:~ error$ echo $HOME
/Users/error
MacBook-Pro:~ error$ echo "$HOME"
/Users/error
MacBook-Pro:~ error$ 

8
2017-07-14 04:34



Bien hecho Michael. Bien hecho. Terminé haciendo un $(eval echo ${BACKUP_DIR}), que funcionó muy bien. Curioso si hay mejores maneras, pero eso funcionó. - Will Ashworth
Vuelve a donde lo hayas definido originalmente $BACKUP_DIR y quitar las comillas dobles. - Michael Hampton♦