Shell-One-Liner: Stdout, Stderr und Returncode auffangen?

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.