2016-11-18 5 views
0

実行中のbashスクリプトにMySQLコマンドがあります。私は他のLinuxのコマンドラインはこの1つ前のコマンド(実際には1でもmysqlコマンドである)が、それはこの1つになったとき、それは動作しません。実行しています:MySQLコマンドを実行していないBashスクリプト

DEST_HOST="localhost" 
DEST_DBNAME="db_name" 
DEST_DBUSER="root" 
DEST_DBPASS="" 

# FILE NAME 
MIGRATION_FILE="migration_database" 

# Export/Import Commands 
DO_DATABASE_UPDATE="mysql --host=$SOURCE_HOST --user=$DEST_DBUSER --password $DEST_DBNAME < $MIGRATION_FILE.sql" 

echo 'Running local updates...' 
$DO_DATABASE_UPDATE 

echo "$DO_DATABASE_UPDATE" 

# Done! 
echo "Complete!" 

私はmigration_database.sqlファイルを持っています私が実行しているフォルダ。ご覧のとおり、私はすべての最後にUPDATEコマンドを表示しています。何が起こるか私はこれを実行し、ヘルプメニューを得るためにmysql -Iを実行したようなmysqlメニューに表示されます。

印刷されたコマンドをコピー&ペーストして実行すると効果的です。なぜbashがスクリプト内からこれを実行しないのか分かりません。

アイデア?

答えて

1
... --password $DEST_DBNAME 

データベースのパスワードは渡さないでください。引数なしで--passwordオプションを使用するだけです。つまり、「パスワードを入力するように促します」という意味です。このスクリプトを非対話型シェルで実行すると、プロンプトが表示されません。

あなたは、引数としてパスワードを設定できます。

... --password='$DEST_DBPASS' $DEST_DBNAME 

それとも実際には、優れたセキュリティではありませんので、私は推薦することは、あなたがすべてで、コマンドラインで使用しているユーザー名&パスワードを入れていないということです習慣。

代わりに、ユーザー名とパスワードを設定ファイルに入れ、その設定ファイルを使用するようにコマンドに指示します。

あなたmigration.cnfで
DO_DATABASE_UPDATE="mysql --defaults-extra-file=$HOME/migration.cnf $DEST_DBNAME < $MIGRATION_FILE.sql" 

:あなたは、MySQL 5.6以降を使用している場合

[client] 
host = localhost 
user = root 
password = xxxxxxxx 

、あなたはまた、約mysql_config_editorので、あなたが暗号化されたファイル内のアカウントの資格情報を保存することができますを学ぶ必要があります。あなたのコメントを再


は、bashの変数にコマンド未満記号を使用して、いくつかの問題がありますか?

はい問題があります。それは、変数拡張の前にシェルプロセスのリダイレクトの評価の順序があるようです。前に気付かなかった私の謝罪

私はあなたのスクリプトを書いていた場合、私はどちらか、このようにそれを記述します。

DO_DATABASE_UPDATE="mysql ...opts..." 
echo 'Running local updates...' 
$DO_DATABASE_UPDATE $DEST_DBNAME < $MIGRATION_FILE.sql 

さもないと、このよう:

DO_DATABASE_UPDATE="mysql ...opts... $DEST_DBNAME -e 'source $MIGRATION_FILE.sql'" 
echo 'Running local updates...' 
$DO_DATABASE_UPDATE 
+0

私のMac上のターミナルは、私はそれが私を促すていない理由です推測していますか?それは間違いなく問題になるでしょう、私はそれが事実であることを認識しませんでした。私は間違いなくこれを試してみます。私はconfファイルの解決が好きです。自分のコンピュータに戻ったときに見つけたものを知らせます。早速のご返事ありがとうございます! – MillerMedia

+0

私は再びこれでプレーしてきた、それは更新スクリプトを実行する必要はありません。それは '<'文字まで実行されますが、その後は動作しません。私が変数宣言を壊してしまったり、変数宣言を '<'で止めて '$ DO_DATABASE_UPDATE <$ MIGRATION_FILE.sql'のようにすると、それは動作します。 bashの変数にコマンド未満記号を使用して、いくつかの問題がありますか? – MillerMedia

1

MySQLコマンド一つのライン

でのBashシェルからLinuxのbashのシェルからMySQLのクエリの迅速実行​​するために、次のコマンドを使用します #mysqlの-u [ユーザー] -p -e [パス] "を[mysqlのコマンド]"

例:

# mysql -u root -pSeCrEt -e "show databases" 

MySQLを実行するためにあなたのBashスクリプトでEOFに 使用、次の構文を使用して、bashスクリプトからMySQLのクエリを実行コマンド:

mysql -u [user] -p[pass] << EOF 
[mysql commands] 
EOF 

例:

#!/bin/bash 
mysql -u root -pSeCrEt << EOF 
use mysql; 
show tables; 
EOF 

MySQLコマンドをリモートで 使用-hオプションを実行しますMySQLサーバのIPアドレスを指定するには:

# mysql -h [ip] -u [user] -p[pass] -e "[mysql commands]" 

例:

# mysql -h 192.168.1.10 -u root -pSeCrEt -e "show databases" 

使用するデータベースを指定し

Use -D option to specify the name of MySQL database : 
# mysql -D [db name] -u [user] -p[pass] -e "[mysql commands]" 

例:私はからそれを実行している

# mysql -D clients -u root -pSeCrEt -e "show tables" 
関連する問題