2017-04-06 5 views
0

Ist es möglich, Dateideskriptoren (z. B. stderr) in bash neu zu definieren?Wie kann ich stdout/stderr in bash umdefinieren?

Ich möchte alle Ausgabe standardmäßig in eine Datei senden, während immer noch die ursprünglichen stderr und stdout verwenden können.

#!/bin/bash 
echo "Error: foo bar" 1>2 
REAL_STDERR=2 
REAL_STDOUT=1 
2=open("/tmp/stderr.log") 
1=open("/tmp/stdout.log") 
echo "This goes to stdout.log" 
if ! curl doesntexist.yet; then 
    echo "Error: Unable to reach host. See stderr.log for details" 1>REAL_STDERR 
fi 
+1

Als Neben - Großbuchstaben-Namen sind für Variablen mit der Bedeutung für das Betriebssystem oder Shell selbst angegeben, während Kleinbuchstaben Namen für die Verwendung der Anwendung reserviert sind. Weitere Informationen finden Sie unter http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html. Beachten Sie dabei, dass Umgebungsvariablen und Shellvariablen einen Namespace teilen (wenn Sie eine Shellvariable zuweisen, die den Namen einer vorhandenen Umgebungsvariablen überlagert, wird letztere überschrieben), so dass die Namenskonventionen notwendigerweise für beide gelten. –

+0

Danke, das wusste ich nicht. –

Antwort

3

Die exec builtin tut dies, wenn kein Name eines Befehls gegeben auszuführen.

exec 3>&1 4>&2 2>/tmp/stderr.log >/tmp/stdout.log 

echo "This goes to stdout.log" 
echo "This goes to stderr.log" >&2 

echo "This goes directly to real stderr" >&4 

Beachten Sie, dass Umleitungen in der Reihenfolge verarbeitet werden, in der sie in der Befehlszeile von links nach rechts angegeben werden. Somit werden &1 und &2 so interpretiert, als ob sie von irgendwelchen früheren Umleitungen auf demselben Befehl modifiziert würden.

Siehe the relevant POSIX spec.


Wenn Sie für Ihre Filedeskriptoren Variablennamen verwenden (mit den Nummern automatisch zugeordnet), werden Sie bash 4.1 oder neuer. Dort können Sie:

exec {real_stderr}>&2 {real_stdout}>&1 >stdout.log 2>stderr.log 
echo "This goes stdout.log" 
echo "This goes to stderr.log" >&2 
echo "This goes to real stderr" >&$real_stderr 
+0

Sie müssen das Bit über die Erhaltung der alten Stdout/Stderr hinzufügen ... – psmears

+0

@psmears, entsprechend geändert; Danke. –

Verwandte Themen