Чтобы «автоматизировать» процесс импорта сгенерированного .sql
файла, избегая при этом всех ловушек, которые могут быть скрыты при попытке передать файлы, stdin
и stdout
просто скажите MySQL выполнить сгенерированный .sql
файл с помощью SOURCE
команды в MySQL.
Синтаксис краткого, но отличного ответа от Кшитиджа Суда дает лучшую отправную точку. Короче говоря, измените команду OP в соответствии с синтаксисом Кшитиджа Суда и замените команды в нем на SOURCE
команду:
#!/bin/bash
mysql -u$user -p$password $dbname -Bse "SOURCE ds_fbids.sql
SOURCE ds_fbidx.sql"
Если имя базы данных включено в сгенерированный .sql
файл, его можно исключить из команды.
Здесь предполагается, что сгенерированный файл действителен как .sql
файл сам по себе. Поскольку файл не перенаправляется, не передается по конвейеру или не обрабатывается оболочкой каким-либо другим образом, нет проблем с необходимостью экранирования любого из символов в сгенерированном выводе из-за оболочки. Правила относительно того, что нужно экранировать в .sql
файле, конечно, по-прежнему применяются.
Как решить проблемы безопасности, связанные с паролем в командной строке, или в my.cnf
файле, и т. Д., Было хорошо рассмотрено в других ответах с некоторыми отличными предложениями. Мой любимый ответ , от Дэнни , обложки , которые, в том числе , как справиться с проблемой при работе с cron
работы, или что - нибудь еще.
Чтобы ответить на комментарий (вопрос?) К краткому ответу, который я упомянул: Нет, его нельзя использовать с синтаксисом HEREDOC, поскольку указана эта команда оболочки. HEREDOC можно использовать в синтаксисе версии перенаправления (без -Bse
опции), поскольку перенаправление ввода-вывода - это то, на чем построен HEREDOC. Если вам нужна функциональность HEREDOC, было бы лучше использовать ее при создании .sql
файла, даже если он временный, и использовать этот файл в качестве «команды» для выполнения с помощью командной строки MySQL.
#!/bin/bash
cat >temp.sql <<SQL_STATEMENTS
...
SELECT \`column_name\` FROM \`table_name\` WHERE \`column_name\`='$shell_variable';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
Имейте в виду, что из-за расширения оболочки вы можете использовать переменные оболочки и среды в HEREDOC. Обратной стороной является то, что вы должны избегать каждой обратной кавычки. MySQL использует их в качестве разделителей для идентификаторов, но оболочка, которая первой получает строку, использует их в качестве разделителей исполняемых команд. Пропустите escape-код по одной обратной кавычке в команде MySQL, и все это взорвется ошибками. Всю проблему можно решить, используя указанную в кавычках LimitString для HEREDOC:
#!/bin/bash
cat >temp.sql <<'SQL_STATEMENTS'
...
SELECT `column_name` FROM `table_name` WHERE `column_name`='constant_value';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
Удаление расширения оболочки таким образом устраняет необходимость экранировать обратные кавычки и другие специальные символы оболочки. Он также удаляет возможность использовать в нем переменные оболочки и среды. Это в значительной степени устраняет преимущества использования HEREDOC внутри сценария оболочки для начала.
Другой вариант - использовать строки в многострочных кавычках, разрешенные в Bash, с версией синтаксиса пакета (с -Bse
). Я не знаю других оболочек, поэтому не могу сказать, работают ли они и в них. В любом случае вам нужно будет использовать это для выполнения более чем одного .sql
файла с SOURCE
командой, поскольку это не завершается a, ;
как другие команды MySQL, и только один разрешен на строку. Многострочная строка может быть заключена в одинарные или двойные кавычки с обычным эффектом расширения оболочки. Здесь также есть те же предостережения, что и при использовании синтаксиса HEREDOC для обратных кавычек и т. Д.
Потенциально лучшим решением было бы использовать язык сценариев, Perl, Python и т. Д., Для создания .sql
файла, как это сделал OP, и SOURCE
этот файл с использованием простого командного синтаксиса вверху. Языки сценариев намного лучше справляются со строками, чем оболочка, и большинство из них имеют встроенные процедуры для обработки кавычек и экранирования, необходимых при работе с MySQL.