Рейтинг:1

Скрипт Bash приостанавливается после открытия mysql

флаг br

Я пытаюсь написать скрипт, который будет заниматься обслуживанием нашего сервера Ubuntu для еще менее разбирающихся в Linux техников, чем я.

Когда я запускаю скрипт от имени администратора (необходим для доступа к mysql), он правильно запрашивает пароль, команда mysql запускается успешно, но следующие команды не выполняются. Терминал просто сидит там и не продолжает работу или не работает.

Любая идея, что я делаю неправильно, была бы очень полезна.Я провел некоторое исследование, но никаких решений не предвидится и довольно сложно для Google.

#! /бин/ш
mysql -p туман

УДАЛИТЬ ИЗ `hosts`, ГДЕ `hostID` = '0';
#больше команд DELETE здесь, удалено для краткости
УДАЛИТЬ ИЗ задач, ГДЕ taskTypeId=8;

$Шелл
Рейтинг:0
флаг in

Еще одна возможность - создать 2 файла: один для вашего скрипта bash (скажем, мыбаш, другой для команд SQL (mydeletes.sql):

мыбаш

#! /бин/ш

mysql -p туман <<mydeletes.sql

mydeletes.sql

УДАЛИТЬ ИЗ «хостов», ГДЕ «hostID» = «0»;
#больше команд DELETE здесь, удалено для краткости
УДАЛИТЬ ИЗ задач, ГДЕ taskTypeId=8;

Это отделит код SQL от кода bash. Это позволит вам загружать, выполнять и отлаживать ваш скрипт SQL во многих (если не во всех) инструментах SQL (DBeaver, Workbench,...)

GBarron avatar
флаг br
Спасибо, Марк, еще один хороший альтернативный ответ!
Рейтинг:0
флаг hr

mysql команда ожидает чтения команд со стандартного ввода. Вы можете предоставить это в сценарии, используя здесь документ:

#! /бин/ш

mysql -p туман <<'EOF'
УДАЛИТЬ ИЗ «хостов», ГДЕ «hostID» = «0»;
#больше команд DELETE здесь, удалено для краткости
УДАЛИТЬ ИЗ задач, ГДЕ taskTypeId=8;
EOF

Управление вернется к оболочке, как только mysql команда выходит. Цитирую первое 'ЕОФ' (или одинаково хорошо \EOF или же "ЭОФ") не позволяет оболочке расширять содержимое - это не проблема для команд в вашем примере, а что-то вроде ВЫБЕРИТЕ ИЗ в противном случае расширит * к списку файлов. Фактическая строка EOF является произвольным.

GBarron avatar
флаг br
Спасибо - я считаю, что это отвечает на мой вопрос. Хотя я не могу точно сказать, работает ли он. Когда я использую этот документ в соответствии с рекомендациями, Терминал закрывается почти сразу после ввода моего пароля. Это *могло* работать, но я не уверен, почему $shell в конце скрипта не держит терминал открытым. Я в основном просто хочу убедиться, что все работает правильно.
GBarron avatar
флаг br
Я также больше читаю здесь документы - аккуратный материал. По сути, я совершенно новичок в bash... Я знаю основы навигации по терминалу и имею некоторый опыт работы с PowerShell, но в остальном я совершенно новичок в bash.
флаг hr
@GBarron Я предлагаю запускать скрипт из интерактивной оболочки, пока вы его не отладите. Если вы *должны* запустить его из какой-либо программы запуска, то добавление команды `read` должно удерживать терминал открытым до тех пор, пока не будет нажата клавиша. Если вы хотите оставить его открытым, запустив новую оболочку, вам, скорее всего, понадобится заглавная буква `$SHELL`, а не `$shell` (которая по умолчанию ничего не устанавливает).
GBarron avatar
флаг br
Еще раз спасибо - вы правы, я ошибся с `$SHELL`. `
GBarron avatar
флаг br
Кроме того, после ввода пароля я получаю: ```ОШИБКА 1064 (42000) в строке 2: ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы узнать правильный синтаксис для использования рядом с WHERE = '0'' в строке 1. ``` Однако я знаю, что эта команда работает, если ее просто ввести вручную.
флаг hr
@GBarron, если вы не заключаете в кавычки «EOF» и используете обратные кавычки вокруг «hostID», как в вашем оригинале, тогда оболочка будет рассматривать это как замену команды. Поскольку команды `hostID`, вероятно, нет, результат будет пустым, что приведет к неправильному синтаксису `WHERE = '0'`
GBarron avatar
флаг br
Я вижу - еще раз спасибо за ваше время. Верните обратные кавычки и исправленную оболочку. Команда остается открытой. Я не вижу никакого вывода из mysql, что странно, но я считаю, что теперь все работает.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.