Puncte:1

Scriptul Bash se întrerupe după deschiderea mysql

drapel br

Încerc să scriu un script care să se ocupe de întreținerea serverului nostru Ubuntu pentru cei mai puțin cunoscători de Linux decât mine.

Când rulez scriptul ca administrator (necesar pentru a accesa mysql), îmi cere corect parola, comanda mysql pornește cu succes, dar următoarele comenzi nu rulează. Terminalul stă acolo și nu continuă sau eșuează.

Orice idee ce gresesc mi-ar fi de mare ajutor.Am făcut câteva cercetări, dar nu am găsit soluții și destul de greu pentru Google.

#! /bin/sh
mysql -p ceață

DELETE FROM `hosts` WHERE `hostID` = '0';
Comenzile #more DELETE aici, eliminate pentru concizie
DELETE FROM tasks WHERE taskTypeId=8;

$Shell
Puncte:0
drapel in

O altă posibilitate este să creați 2 fișiere: unul pentru scriptul bash (să zicem mybash, celălalt pentru comenzile SQL (mydeletes.sql):

mybash

#! /bin/sh

mysql -p fog <<mydeletes.sql

mydeletes.sql

DELETE FROM 'hosts' WHERE 'hostID' = '0';
#mai multe comenzi DELETE aici, eliminate pentru concizie
DELETE FROM tasks WHERE taskTypeId=8;

Acest lucru va separa codul SQL de codul bash. Vă va permite să încărcați, să executați și să vă depanați scriptul SQL în multe (dacă nu toate) instrumente SQL (DBeaver, Workbench,...)

GBarron avatar
drapel br
Mulțumesc Marc, un alt răspuns alternativ bun!
Puncte:0
drapel hr

The mysql comanda se așteaptă să citească comenzile de la intrarea standard. Puteți furniza acest lucru într-un script folosind a aici document:

#! /bin/sh

mysql -p ceață <<'EOF'
DELETE FROM 'hosts' WHERE 'hostID' = '0';
Comenzile #more DELETE aici, eliminate pentru concizie
DELETE FROM tasks WHERE taskTypeId=8;
EOF

Controlul va reveni la shell odată ce mysql iese de comandă. Citându-l pe primul „EOF” (sau la fel de bine \EOF sau "EOF") împiedică shell-ul să extindă conținutul - nu o problemă pentru comenzile din exemplul dvs., ci ceva de genul SELECTAȚI DIN altfel ar extinde * la o listă de fișiere. Coarda propriu-zisă EOF este arbitrară.

GBarron avatar
drapel br
Mulțumesc - cred că asta răspunde la întrebarea mea. Nu pot spune cu siguranță dacă funcționează, totuși. Când folosesc documentul de aici conform recomandărilor, terminalul se închide aproape imediat după ce am introdus parola. *Ar putea* să funcționeze, dar nu sunt sigur de ce $shell-ul de la sfârșitul scriptului nu ține Terminalul deschis. În principal, vreau să mă asigur că totul merge bine.
GBarron avatar
drapel br
Citesc, de asemenea, mai multe documente de aici, precum și lucruri îngrijite. În esență, sunt complet nou în bash... Cunosc elementele de bază ale navigării în Terminal și am ceva experiență cu PowerShell, dar în rest, sunt complet nou în bash.
drapel hr
@GBarron Vă sugerez să rulați scriptul dintr-un shell interactiv până când îl depanați. Dacă *trebuie* să-l rulați dintr-un fel de lansator, atunci adăugarea unei comenzi `citire` ar trebui să țină terminalul deschis până când o tastă este apăsată. Dacă doriți să-l țineți deschis, pornind un nou shell, probabil că veți avea nevoie de majuscule `$SHELL` mai degrabă decât `$shell` (care nu va fi setat la nimic, implicit).
GBarron avatar
drapel br
Mulțumesc din nou - ai dreptate, am greșit `$SHELL`. `
GBarron avatar
drapel br
În plus, după ce introduc parola primesc: ```EROARE 1064 (42000) la linia 2: Aveți o eroare în sintaxa dvs. SQL; verificați manualul care corespunde versiunii dvs. de server MariaDB pentru sintaxa corectă de utilizat lângă „WHERE = „0” la linia 1 ``` Cu toate acestea, știu că această comandă funcționează atunci când este introdusă manual.
drapel hr
@GBarron dacă nu citați `EOF` și folosiți ghilimele înapoi în jurul `hostID` ca în original, atunci shell-ul îl va trata ca o înlocuire de comandă. Deoarece probabil că nu există o comandă `hostID`, rezultatul va fi gol, rezultând o sintaxă incorectă `WHERE = '0'`
GBarron avatar
drapel br
Văd, mulțumesc din nou pentru timpul acordat. Puneți ghilimelele din spate înapoi și fixați coajă. Comanda rămâne deschisă acum. Nu văd nicio ieșire din mysql, ceea ce este ciudat, dar cred că totul funcționează acum.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.