Чтобы «автоматизировать» процесс импорта сгенерированного .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.