Einen Bash-Befehlsfehler in einer Variablen abfangen

478
user3541631

Ich verwende psql(PostgreSQL) -Befehl in einem Bash-Skript:

function create_database () { sudo -u postgres psql -c "CREATE DATABASE $1 WITH OWNER $2;" 2>ERROR if [[ $? -ne 0]; then echo "error -> $ERROR" return 1 else: .... return 0 } 

Ich versuche das zu fangen errorund an eine Variable zu übergeben, aber die Variable ist leer.

0
Eine faire Warnung: psql gibt keine Fehlercodes zurück, wie Sie es erwarten würden. Obwohl ein Fehler auftritt, gibt psql nicht unbedingt einen Fehlercode zurück (gibt 0 zurück). Bitte überprüfen Sie das Handbuch. Aulis Ronkainen vor 5 Jahren 0
Ich empfehle, in der Shell All-Caps-Variablennamen (wie "ERROR") zu verwenden. Es gibt eine Reihe von Umgebungsvariablen mit besonderen Bedeutungen, und wenn Sie einen dieser Namen aus Versehen verwenden, kann dies merkwürdige Auswirkungen haben. Kleinere und gemischte Variablen sind in dieser Hinsicht sicherer. Gordon Davisson vor 5 Jahren 0

1 Antwort auf die Frage

3
md2perpe

2>ERRORSendet die stderrAusgabe an eine Datei mit dem Namen ERRORund nicht an eine Variable. Versuchen Sie stattdessen Folgendes:

ERROR=$(sudo -u postgres psql -c "CREATE DATABASE $1 WITH OWNER $2;" 2>&1 1>/dev/null) 
Das kann ich nicht, weil ich möchte, dass stdout auf null geht und auf dem else eine andere Nachricht anzeigt user3541631 vor 5 Jahren 0
@ user3541631. Ich habe meine Antwort so aktualisiert, dass stdout an `/ dev / null` gesendet wird. md2perpe vor 5 Jahren 1