Ein bisschen Shell-Umleitung

10. Mai 2009 von Prashant · Kommentare
Abgelegt unter: Technik

Hier ist, wie wir normalerweise tun Shell-Umleitung
$ ./pgm.sh args >out.txt 2>err.txt
Ich wollte es ein bisschen ändern, und führen Sie wie folgt
$ ./pgm.sh args
mit der Forderung, dass Leistung und Fehler sollte bis zu einem gewissen Dateinamen innerhalb pgm.sh basierend auf args berechnet gehen. Ein anschauliches Fall sein könnte, wenn Datum ist Teil des args. Du möchtest also stdout zu gehen, zu sagen / your / directory / pgm_out_YYYYMMDD.txt 1

Das Problem mit der normale Weg der Neuausrichtung N>file.txt dh assoziieren Dateideskriptor N bis file.txt, ist, dass es nur für die neu gegabelten Prozess und nicht für den aktuellen Prozess funktioniert.
so
$ echo hi 1>out.txt ; echo hii . wird hallo schicken, um out.txt aber hii nach stdout schreiben 2

Dies ist, wo exec kommt uns zu Hilfe. Wenn wir exec 1>somefile.txt dann von Rest des Skripts wird somefile.txt gehen

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh wird hallo sowie hii umleiten zu out.txt

Ähnlich wie stdout sowie stderr umleiten wir etwas tun
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Jetzt kommen zurück zur ursprünglichen Punkt der Umleitung zu einem gewissen Datei aus dem Inneren der Schale, sagen wir mal-Programm berechnet den Dateinamen in einer Variable OUTFILE, konnten wir gerade getan haben exec 1>$OUTFILE

Das löst das gegenwärtige Problem. Aber Sie können gerne durch folgende Beispiel, das "Random Access"-Datei in der Shell-Skript erreicht zu gehen. Beispiel stammt von hier
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890

Mit Kommentaren, ist dieser Code selbsterklärend.
-
1 Es kann auch geschehen durch $ ./pgm.sh args >pgm_out`date +%Y%m%d` Idee ist, sondern diesen Dateinamen basierend auf einem gewissen Logik im Programm selbst zu generieren.
2 1 1> out.txt ist überflüssig, aber es verdeutlicht, dass wir hier sind, Umleitung FD 1