Mysql
 sql >> Database >  >> RDS >> Mysql

Come sopprimere l'output e verificare se un comando ha esito positivo o meno?

Aggiorna :

  • Il if ($LASTEXITCODE -eq 0) ... l'approccio continuerà a funzionare in modo solido con programmi esterni.
  • Tuttavia, se e quando la versione precedente alla v7.2 funzione sperimentale denominato PSNotApplyErrorActionToStderr diventa una funzionalità ufficiale, if ($?) ... funzionerà anche in modo robusto - vedi questa risposta per ulteriori informazioni.

Usa $LASTEXITCODE -eq 0 anziché $? per rilevare in modo affidabile un codice di uscita diverso da zero (tipicamente segnalazione di guasto) segnalato da un programma esterno.

Puoi quindi utilizzare *> $null per sopprimere categoricamente tutto l'output senza doversi preoccupare dell'impatto di quel reindirizzamento su $? :

mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
  "Hooray!"
} else {
  "Boo!"
}

Utilizzo di un reindirizzamento che coinvolge il flusso di errori di PowerShell, in modo esplicito tramite 2> o implicitamente tramite *> - significa che se dei dati vengono ricevuti tramite quel flusso - che nel caso di chiamare un programma esterno significa qualsiasi output da stderr - PowerShell imposta $? a $false .

Tuttavia, nel regno dei programmi console/terminali esterni, stderr non viene utilizzato solo per generare errore informazioni, ma qualsiasi informazione che non sia dati , come le informazioni sullo stato. Pertanto, non puoi dedurre il fallimento dalla presenza di output stderr .

I programmi console/terminali esterni comunicano il loro stato di successo esclusivamente tramite il loro codice di uscita , che PowerShell riflette nel $LASTEXITCODE automatico variabile.

Ne consegue da quanto sopra che $? può essere $false anche se il codice di uscita è 0 , quindi non è un indicatore di successo affidabile, a differenza di $LASTEXITCODE .