Auch wenn es leicht ist, eines davon zu erhaschen, auch alle drei Werte lassen sich separat speichern:
(Original von http://stackoverflow.com/a/26827443/841033)
eval "$({ stderr=$({ stdout=$(
command-to-execute with parameters
); ret=$?; } 2>&1; declare -p stdout ret >&2); declare -p stderr; } 2>&1)";
Dadurch stehen die entsprechenden Werte in den Variablen $ret, $stdout und $stderr bereit.
Z.B:
eval "$({ stderr=$({ stdout=$(curl --fail --head www.google.at); ret=$?; } 2>&1; declare -p stdout ret >&2); declare -p stderr; } 2>&1)"; echo "stderr:$stderr"; echo "stdout:$stdout"; echo "return code:$ret"
Der eigentliche Befehl ist lediglich curl --fail --head www.google.at
In stderr
speichert curl den Fortschritt (der hier nichtssagend kurz ist), stdout
beinhaltet die Headerinformationen der angeforderten Website. Der Rückgabewert war in diesem Fall 0
.
stderr: % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
stdout:HTTP/1.1 200 OK
Date: Wed, 29 Jul 2015 13:55:56 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
[...]
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding
return code:0
Ein Beispiel im Fehlerfall von curl - etwas selbsterklärender.
eval "$({ stderr=$({ stdout=$(curl --fail --head www.google.at1); ret=$?; } 2>&1; declare -p stdout ret >&2); declare -p stderr; } 2>&1)"; echo "stderr:$stderr"; echo "stdout:$stdout"; echo "return code:$ret";
stderr:
curl: (6) Couldn't resolve host 'www.google.at1'
stdout:
return code:6
Im Bezug auf den vorigen Blogeintrag (https://www.psit.at/blogs/peter-schmidt/20150729-shell-one-liner-ist-ein...) kann das verwendet werden, um die Fehlermeldung von curl direkt für Ausgabe oder Logging zu verwenden. Eventuell können unterschiedliche Fehlercodes auch für unterschiedliche Retry-Verfahren verwendet werden, aber das überlasse ich eurer Kreativität.
- Blog von Peter Schmidt
- 7409 Aufrufe