Einige Tricks zur Umleitung
Einige Syntax-Besonderheiten hierzu können wichtige Verhaltensweisen aufweisen. Es gibt einige kleine Proben über Umleitungen, STDERR
, STDOUT
und Argumente Ordnung .
1 - Überschreiben oder Anhängen?
Symbol >
bedeutet Umleitung .
>
bedeuten , an eine vollständige Datei senden und das Ziel überschreiben, falls vorhanden (siehe noclobber
Bash-Funktion auf # 3 später).
>>
meine senden zusätzlich zu würde an Ziel anhängen, wenn vorhanden.
In jedem Fall würde die Datei erstellt, wenn sie nicht vorhanden wäre.
2 - Die Shell-Befehlszeile ist auftragsabhängig !!
Um dies zu testen, benötigen wir einen einfachen Befehl, der an beide Ausgänge etwas sendet :
$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
(Vorausgesetzt, Sie haben kein Verzeichnis mit dem Namen /tnt
natürlich ;). Nun, wir haben es !!
Also mal sehen:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1
$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory
Die letzte Befehlszeile wird STDERR
auf der Konsole ausgegeben, und es scheint nicht das erwartete Verhalten zu sein ... Aber ...
Wenn Sie eine Nachfilterung für eine Ausgabe, die andere oder beide durchführen möchten :
$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'
$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
Beachten Sie, dass die letzte Befehlszeile in diesem Absatz genau die gleiche ist wie im vorherigen Absatz, in dem ich geschrieben habe , dass sie nicht das erwartete Verhalten zu sein scheint (dies könnte also sogar ein erwartetes Verhalten sein).
Nun, es gibt ein paar Tricks zu Umleitungen, um
an beiden Ausgängen unterschiedliche Operationen durchzuführen :
$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2 2>&1 | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory
Nota: &9
Deskriptor würde wegen spontan auftreten ) 9>&2
.
Nachtrag: nota! Mit der neuen Version vonBash( >4.0
) Es gibt eine neue Funktion und eine sexy Syntax für diese Art von Dingen:
$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory
Und schließlich für eine solche kaskadierende Ausgabeformatierung:
$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp
2 E: ls: cannot access /tnt: No such file or directory
Nachtrag: nota! Gleiche neue Syntax in beiden Richtungen:
$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
2 E: ls: cannot access /tnt: No such file or directory
Wenn STDOUT
Sie einen bestimmten Filter durchlaufen, gehen Sie zu einem STDERR
anderen und schließlich führen beide zusammengeführten Ausgänge einen dritten Befehlsfilter durch.
3 - Ein Wort zu noclobber
Option und >|
Syntax
Hier geht es ums Überschreiben :
Während set -o noclobber
anweisen bash nicht eine vorhandene Datei zu überschreiben, die >|
Syntax können Sie durch diese Einschränkung passieren:
$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:15 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:19 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:21 CET 2013
Die Datei wird jetzt jedes Mal überschrieben:
$ set -o noclobber
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
Durchgehen mit >|
:
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:18:58 CET 2013
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:19:01 CET 2013
Deaktivieren Sie diese Option und / oder fragen Sie nach, falls bereits festgelegt.
$ set -o | grep noclobber
noclobber on
$ set +o noclobber
$ set -o | grep noclobber
noclobber off
$ date > $testfile ; cat $testfile
Mon Jan 7 13:24:27 CET 2013
$ rm $testfile
4 - Letzter Trick und mehr ...
Um beide Ausgaben von einem bestimmten Befehl umzuleiten , sehen wir, dass eine richtige Syntax sein könnte:
$ ls -ld /tmp /tnt >/dev/null 2>&1
Für diesen speziellen Fall gibt es eine Verknüpfungssyntax: &>
... oder>&
$ ls -ld /tmp /tnt &>/dev/null
$ ls -ld /tmp /tnt >&/dev/null
Hinweis: Wenn 2>&1
vorhanden, 1>&2
ist auch eine korrekte Syntax:
$ ls -ld /tmp /tnt 2>/dev/null 1>&2
4b- Nun werde ich Sie überlegen lassen:
$ ls -ld /tmp /tnt 2>&1 1>&2 | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
4c- Wenn Sie an weiteren Informationen interessiert sind
Sie können das feine Handbuch lesen, indem Sie auf Folgendes klicken:
man -Len -Pless\ +/^REDIRECTION bash
in einem Bash Konsole ;-)