web-dev-qa-db-ja.com

bashスクリプトによるmysqldumpが「そのようなファイルまたはディレクトリはありません」で失敗する

これは私にナッツを運転しています。助けてくれてありがとう!

$MYSQLDUMP --login-path=$Host $DATABASE > "$BACKUP_DIR/${Host}__${DATABASE}__${NOW}.sql";
  • バイナリ$MYSQLDUMP(スクリプト内)に有効な完全パスがあることを確認しました
  • コマンドが完了しました(エコーで確認)
  • $NOWはスクリプトの早い段階で設定されており、ここでは設定されていません...そのため、時間は私たちにも何にも変わりません
  • これはcron経由で実行されていません
  • コマンドラインを介してスクリプトを実行するユーザーは、実際のディレクトリへのアクセス/権限も持っています
  • 奇妙な文字がないことを確認するためにdos2unixを試しました。私はMacを使っていますが、ちょっと...
  • >のように\>をエスケープしようとしましたが、代わりにmysqldump: Couldn't find table: ">"エラーが生成されました

これは私を夢中にさせています。ここで何が欠けているのかわかりませんか?私たちは出力を指示しているだけであり、それは私が見落としている途方もなく明白なものだと感じています。

[〜#〜]更新[〜#〜]

ここにデバッグおよび支援するテストをいくつか追加しました。

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)"

...プロデュース...

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は、スクリプトの詳細な出力を処理するもう1つの関数なので、心配する必要はありません。デバッグ情報を出力するためだけのものです。

同じ端末のコンテンツを手動で~/www/__MYSQL/backup/にリストすると、次のようになります。

$ 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 ..

それは奇妙だ。 Bashにはほとんどアクセスできないようですが、私の通常のユーザー(そもそもbashスクリプトを実行しているユーザー)はアクセスできます。

別の更新

echo $(whoami);
echo ~;
exit;

...プロデュース...

william
/Users/william
7
Will Ashworth

問題は、チルダを二重引用符で囲んでいることです。これを行うと、notがホームディレクトリのパスに展開されます。

検討してください:

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$ 

二重引用符を引き続き使用する場合は、$HOMEチルダの代わりに変数。

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