Umeitung in _2_ Textdateien gleichzeitig
Wie leite ich in _2_ Textdateien mit > bzw. >> gleichzeitig um? Also ls soll zB in datei1.txt und datei2.txt umgeleitet werden. Ich benötige das für die Generierung von 2 fast identen Scripts durch ein Script. Al
Am Donnerstag, 27. November 2003 15:02 schrieb Al Bogner:
Wie leite ich in _2_ Textdateien mit > bzw. >> gleichzeitig um?
Also ls soll zB in datei1.txt und datei2.txt umgeleitet werden. Ich benötige das für die Generierung von 2 fast identen Scripts durch ein Script.
Al
man tee Alfred
Am Donnerstag, 27. November 2003 15:14 schrieb Alfred Reinhard:
Am Donnerstag, 27. November 2003 15:02 schrieb Al Bogner:
Wie leite ich in _2_ Textdateien mit > bzw. >> gleichzeitig um?
Also ls soll zB in datei1.txt und datei2.txt umgeleitet werden. Ich benötige das für die Generierung von 2 fast identen Scripts durch ein Script.
man tee
Danke, ist es sinnvoll > mit tee zu kombinieren, um die Ausgabe auf die Konsole zu unterdrücken, oder gibt es da was "schöneres"? Al
Am Donnerstag, 27. November 2003 15:29 schrieb Al Bogner:
Also ls soll zB in datei1.txt und datei2.txt umgeleitet werden. Ich benötige das für die Generierung von 2 fast identen Scripts durch ein Script.
man tee
Danke, ist es sinnvoll > mit tee zu kombinieren, um die Ausgabe auf die Konsole zu unterdrücken, oder gibt es da was "schöneres"?
Wie meinst Du das? $ programm | tee ausgabe1 > ausgabe2 Dann steht die Ausgabe von "programm" in "ausgabe1" und "ausgabe2". -- Andreas
Am Donnerstag, 27. November 2003 15:29 schrieb Al Bogner:
Wie leite ich in _2_ Textdateien mit > bzw. >> gleichzeitig um?
Also ls soll zB in datei1.txt und datei2.txt umgeleitet werden. Ich benötige das für die Generierung von 2 fast identen Scripts durch ein Script.
Danke, ist es sinnvoll > mit tee zu kombinieren, um die Ausgabe auf die Konsole zu unterdrücken, oder gibt es da was "schöneres"?
Da habe ich wohl zu schnell gefreut. $befehl > datei1 | tee datei2 erzeugt zwar datei2, aber die ist leer, $befehl | tee datei1 datei2 ist nicht wirklich brauchbar, da hier alle Befehle des erzeugten Scripts ausgegeben werden. Al
Am Donnerstag, 27. November 2003 15:44 schrieb Al Bogner:
Wie leite ich in _2_ Textdateien mit > bzw. >> gleichzeitig um?
Also ls soll zB in datei1.txt und datei2.txt umgeleitet werden. Ich benötige das für die Generierung von 2 fast identen Scripts durch ein Script.
Danke, ist es sinnvoll > mit tee zu kombinieren, um die Ausgabe auf die Konsole zu unterdrücken, oder gibt es da was "schöneres"?
Da habe ich wohl zu schnell gefreut. $befehl > datei1 | tee datei2 erzeugt zwar datei2, aber die ist leer, $befehl | tee datei1 datei2 ist nicht wirklich brauchbar, da hier alle Befehle des erzeugten Scripts ausgegeben werden.
Was hast Du denn erwartet bei "Umleitung in 2 Dateien gleichzeitig"? Ich habe leider keine Ahnung, was dieses Programm macht bzw. wo der Unterschied in den zwei Ausgaben sein soll. Das vernünftigeste denke ich wäre ein "Programm" zu schreiben, was direkt die beiden dateien erzeugt. Oder alternativ ein zweites "programm", welches die Ausgabe des ersten entsprechend modifiziert, dass es script2 ausgibt: $ programm1 | tee script1 | programm2 > script2 Oder Du trickst ein wenig und benutzt in Deinem "Programm" zwei Ausgabeströme, die Du dann in der Shell auffängst. Aaber das hängt doch sehr stark von der Logik bzw. Ausgabe des Programms ab, welches wir leider nicht wissen. -- Andreas
Am Donnerstag, 27. November 2003 16:01 schrieb Andreas Winkelmann:
Am Donnerstag, 27. November 2003 15:44 schrieb Al Bogner:
Wie leite ich in _2_ Textdateien mit > bzw. >> gleichzeitig um?
Also ls soll zB in datei1.txt und datei2.txt umgeleitet werden. Ich benötige das für die Generierung von 2 fast identen Scripts durch ein Script.
Danke, ist es sinnvoll > mit tee zu kombinieren, um die Ausgabe auf die Konsole zu unterdrücken, oder gibt es da was "schöneres"?
Da habe ich wohl zu schnell gefreut. $befehl > datei1 | tee datei2 erzeugt zwar datei2, aber die ist leer, $befehl | tee datei1 datei2 ist nicht wirklich brauchbar, da hier alle Befehle des erzeugten Scripts ausgegeben werden.
Ich habe leider keine Ahnung, was dieses Programm macht bzw. wo der Unterschied in den zwei Ausgaben sein soll.
Das ist ein simples Shellscript mit ca. 50 Zeilen, das einfach auf die unterschiedlichen Möglichkeiten der verschiedenen Brenner auf den diversen Rechnern im lokalen Netz eingeht. Das Script funktioniert auch. Nun benötige ich eine Brennvariante und zwar einmal für iso-level-1 und ein weiteres Mal für iso-level-3, wobei die Dateinamen gegenüber den Originaldateinamen mittels Link modifziert wurden. Bis jetzt ist das alles kein Problem. Dieses Script erzeugt nun ein _weiteres_ Script, das die Hardware, den Rohling, usw. abfrägt und danach einen Befehl für mkisofs und cdrecord generiert, wobei auch wieder automatisch unterschieden wird, ob eine CD oder DVD gebrannt wird, etc. Grundsätzlich funktioniert auch das. Dieses Script beginnt etwa so: BRENNSCRIPTLFDTEE="$BRENNSCRIPTISO1LFD $BRENNSCRIPTISO3LFD" echo "#!/bin/bash" | tee $BRENNSCRIPTLFDTEE echo 'RECHNERNAME=`uname -n`' | tee -a $BRENNSCRIPTLFDTEE ... Vom Ergebnis her würde das auch passen, nur wenn das Script läuft, das das Brennscript erzeugt, sieht man auf der Konsole #!/bin/bash RECHNERNAME=`uname -n` ... Im Gegensatz zu echo "#!/bin/bash" > $BRENNSCRIPTISO1LFD ... wo die Ausgabe direkt in die Datei geleitet wird und damit auf der Konsole nicht ersichtlich ist, was das Script gerade macht. So eine Ausgabe ist ja nicht gerade sinnvoll, wenn das Shellscript ein weiteres Script erzeugt: echo "echo MIT DIESEM BRENNER KANN KEINE DVD GEBRANNT WERDEN! - SCRIPTABBRUCH" Es wird ja nicht das laufende Script abgebrochen, sondern das könnte eine Meldung sein, wenn das andere Script abläuft. Für das Brennen der unterschiedlichen ISO-Levels ist das Script bis auf ein paar Zeilen also ziemlich ident, d.h. ich möchte, dass normalerweise in 2 Dateien umgeleitet wird und in den Ausnahmefällen in jeweils nur eine, wobei beim Ablauf des (1.) Scripts _keine_ Ausgabe auf die Konsole erfolgen soll. Al
Am Donnerstag, 27. November 2003 16:37 schrieb Al Bogner:
Ich habe leider keine Ahnung, was dieses Programm macht bzw. wo der Unterschied in den zwei Ausgaben sein soll.
Das Script funktioniert auch. Nun benötige ich eine Brennvariante und zwar einmal für iso-level-1 und ein weiteres Mal für iso-level-3, wobei die Dateinamen gegenüber den Originaldateinamen mittels Link modifziert wurden. Bis jetzt ist das alles kein Problem.
Du weisst schon, dass es sowas wie "if"-Abfragen gibt? Wieso schreibst du nicht ein Script, was je nach Bedingung unterschiedliche Sachen macht. Das könntest Du z.B. Aufrufparametern realisieren. Das ist dann ungefähr so wie zwei verschiedene Scripte. Einmal rufst du es mit "./script iso1" auf und für das andere "./script iso3". Das ganze mit einem Hauptscript zu machen und dann für die Eventualitäten SubScripts zu erzeugen ist denke ich nicht so das wahre. Vielleicht ist mir das ganze auch zu hoch. -- Andreas
Am Donnerstag, 27. November 2003 18:16 schrieb Andreas Winkelmann:
Du weisst schon, dass es sowas wie "if"-Abfragen gibt?
Hab's gerade nachgezählt. Es kommen ganze 36 Stück davon im Script vor.
schreibst du nicht ein Script, was je nach Bedingung unterschiedliche Sachen macht.
Irgendwie könnte man das mit "if" sicher auch hinbekommen. Das entspricht aber nicht meinen Wünschen für den Anwender.
Das könntest Du z.B. Aufrufparametern realisieren. Das ist dann ungefähr so wie zwei verschiedene Scripte. Einmal rufst du es mit "./script iso1" auf und für das andere "./script iso3".
Das ist mir klar. Das erzeugte Script soll "DAU-sicher" von anderen ausgeführt werden können und ich will 2 Scripts mit unterschiedlichen Namen haben.
Das ganze mit einem Hauptscript zu machen und dann für die Eventualitäten SubScripts zu erzeugen ist denke ich nicht so das wahre.
Die ganzen Hintergründe des Scripts zu erklären, wäre ein "halber Roman". Natürlich kann man fast immer etwas irgendwie anders besser machen. Da der iso-level-1-Teil bereits in vielen Kombinationen auf Anwender-Fehler ausgetestet ist, will ich da auch nicht mehr so viel ändern. Könnte man die Ausgabe nicht "woanders" hin umleiten, sodass sie "unsichtibar" ist und tee es sich von dort holt? Ich habe mir auch schon überlegt, das Script einfach in Datei1 zu schreiben und bevor die Ausnahme kommt nach Datei2 zu kopieren bzw. später die Dateien zusammenzuhängen. Aber das ist schon ein ziemlicher "Würgaround". Eine andere Lösung wäre mit sed die jeweils überflüssigen Zeilen zu löschen. Aber vielleicht hat da noch wer eine andere Idee. Al
Am Donnerstag, 27. November 2003 20:12 schrieb Al Bogner: [...]
Das ist mir klar. Das erzeugte Script soll "DAU-sicher" von anderen ausgeführt werden können und ich will 2 Scripts mit unterschiedlichen Namen haben. [...]
ln mache_iso mache_iso1 ln mache_iso mache_iso3 Im Script: if test `basename $0` = mache_iso1; then ... else ... fi Jan
On Thu, Nov 27, 2003 at 03:44:29PM +0100, Al Bogner wrote:
Da habe ich wohl zu schnell gefreut. $befehl > datei1 | tee datei2 erzeugt zwar datei2, aber die ist leer, $befehl | tee datei1 datei2 ist nicht wirklich brauchbar, da hier alle Befehle des erzeugten Scripts ausgegeben werden.
Richtig waere natuerlich auch: $befehl | tee datei1 | tee datei2 wenn dich auch die Ausgabe interessiert und $befehl | tee datei1 > datei2 wenn nicht. -- Have fun, Peter
Am Donnerstag, 27. November 2003 23:40 schrieb Peter Wiersig:
On Thu, Nov 27, 2003 at 03:44:29PM +0100, Al Bogner wrote:
Da habe ich wohl zu schnell gefreut. $befehl > datei1 | tee datei2 erzeugt zwar datei2, aber die ist leer, $befehl | tee datei1 datei2 ist nicht wirklich brauchbar, da hier alle Befehle des erzeugten Scripts ausgegeben werden.
Richtig waere natuerlich auch: $befehl | tee datei1 | tee datei2 wenn dich auch die Ausgabe interessiert und $befehl | tee datei1 > datei2 wenn nicht.
Jaaa! Das funktioniert so wie ich es mir vorstelle. Man sollte immer alles ausprobieren. Andreas hatte das ja auch so (oder ähnlich, ich weiß es nicht mehr genau auswendig), vorgeschlagen. Ich dachte tee zeigt die Ausgabe grundsätzlich an und hatte das gar nicht probiert, mit dem folgenden > ist die Ausgabe aber weg. Al
Am Donnerstag, 27. November 2003 23:52 schrieb Al Bogner:
$befehl | tee datei1 > datei2 wenn nicht.
Jaaa! Das funktioniert so wie ich es mir vorstelle.
Mit dem Quoten habe ich aber noch ein Problem. So funktioniert es: echo 'RECHNER=`uname -n`' | tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD Wenn ich nun ein Variable definiere, die etwa so aussieht: VAR="| tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD" dann funktioniert echo 'RECHNER=`uname -n`' $VAR nicht. Wie ist richtig zu quoten? Al
Hallo Al, * Al schrieb am 28.11.2003:
Am Donnerstag, 27. November 2003 23:52 schrieb Al Bogner:
$befehl | tee datei1 > datei2 wenn nicht.
Jaaa! Das funktioniert so wie ich es mir vorstelle.
Mit dem Quoten habe ich aber noch ein Problem.
So funktioniert es: echo 'RECHNER=`uname -n`' | tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD
Ist das >> beabsichtigt?
Wenn ich nun ein Variable definiere, die etwa so aussieht: VAR="| tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD"
dann funktioniert echo 'RECHNER=`uname -n`' $VAR nicht.
Wie ist richtig zu quoten?
Kann es sein, dass das prinzipbedingt nicht funktioniert? D.h. die Shell ersetzt $VAR durch den Inhalt, müsste aber dann nochmal das | lesen, damit auch gepipt wird. Wenn ja, dann vielleicht so: VAR="tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD" echo 'RECHNER=`uname -n`' | $VAR Grüße, Tom
Hi On Friday 28 November 2003 14:57, Thomas Preissler wrote:
Hallo Al,
* Al schrieb am 28.11.2003:
Wenn ich nun ein Variable definiere, die etwa so aussieht: VAR="| tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD"
dann funktioniert echo 'RECHNER=`uname -n`' $VAR nicht.
Wie ist richtig zu quoten?
Wo sich hier gerade Leute über "ich weiß" != "ich meine" unterhalten. Ich meine gar nicht.
Kann es sein, dass das prinzipbedingt nicht funktioniert? D.h. die Shell ersetzt $VAR durch den Inhalt, müsste aber dann nochmal das | lesen, damit auch gepipt wird.
Ich meine auch, daß das prinzipbedingt nicht geht. Das wäre schon fast sowas wie automorpher Code. Die bash müßte, um das von Al gewollte zu tun, während der Laufzeit permanent die gesamte Befehlszeile nach jeder Variablenersetzung immer wieder neu parsen bis keinerlei Zeichen überbleiben, die irgendwas mit der Struktur zu tun haben. a="abc $a" führt ja auch nicht dazu, daß in a ein unendlich langer String steht.
Wenn ja, dann vielleicht so:
VAR="tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD" echo 'RECHNER=`uname -n`' | $VAR
Ne, leider auch nicht. Man kann durch Variablen keine pipe-Zwischenstücke einfügen oder anhängen. Man könnte zwar "Gewaltlösungen" anstreben. Z.B. aus dem Skript heraus zweites Skript erzeugen und dieses dann selbst aufrufen. Aber so will man nicht programmieren. Eine Variable sollte nicht genutzt werden um ausführbare Skriptteile zu enthalten und um dann "die Variable auszuführen". Nimm es mir nicht über Al, aber Jan und Andreas haben ja schon gesagt, dass man auch if-Abfragen benutzen darf und gelegentlich auch soll. Und ich kann mich dem nur anschließen. Die Methode ausführbare Teile der Befehlszeile in Form von Variablen in die Befehlszeile einzufügen klingt irgendwie wieder so, als ob man das durch gezielte Anwendung von if oder case besser lösen könnte. mfg Axel
Am Freitag, 28. November 2003 16:01 schrieb Axel Heinrici:
Ich meine auch, daß das prinzipbedingt nicht geht
Das dachte ich mir auch, aber ich habe bis jetzt selten erlebt, das etwas unmöglich ist, höchstens schlecht programmiert und durch Fehler lernt man. :-)
VAR="tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD" echo 'RECHNER=`uname -n`' | $VAR
Ne, leider auch nicht.
Das hatte ich auch probiert
Nimm es mir nicht über Al, aber Jan und Andreas haben ja schon gesagt, dass man auch if-Abfragen benutzen darf und gelegentlich auch soll.
Darüber habe ich auch schon intensiv nachgedacht. Praktikabel scheint
aber nur die "basename"-Lösung zu sein. Mit "tee -a $SCRIPTISO1LFD >>
$SCRIPTISO3LFD" funktioniert nun alles richtig und ja ">>" ist
beabsichtigt. Es wird ja Scriptzeile für Scriptzeile angefügt. Der
Grund warum ich das in eine Variable setzen möchte, ist, dass genau
genommen nur unter einer bestimmten Bedingung eine doppelte Ausgabe
notwendig ist und bei allen anderen ein ">> $SCRIPTISO1LFD" reichen
würde (also if -else). Das überflüssige Script ist nicht tragisch, aber
ich möchte ja auch dazulernen. :-)
Ich überlege jetzt noch in eine andere Richtung. Nachdem nun das
Ergebnis nun grundsätzlich so ist, wie ich es möchte, habe ich
festgestellt, dass sich die beiden Scripts nur im Bereich mkisofs
unterscheiden, wobei wieder unterschiedl. mkisofs-Optionen verwendet
werden, wenn eine CD oder eine DVD gebrannt wird. Vom Prinzip achtet
das Script eigentlich nur darauf, dass für die diversen Brenner und
Rohlinge keine falschen Optionen eingegeben werden und dadurch der
Rohling verbrannt wird. Es gibt also viele "case" und "if" und sonst
ist nicht viel dahinter.
Die Umleitung Zeile für _Zeile_ in ein neues Script ist also vermutlich
gar nicht notwendig. Man könnte also vielleicht mit dem "here"-Befehl
den 1. Teil des Scripts (ca. 20 Zeilen) in die 2 Dateien umleiten, dann
mit "if" den mkisofs-Teil in die jeweilige Datei und letztlich den Rest
des Scripts an beide Dateien anhängen.
Ich habe nur noch nicht rausgefunden, wie das genau zu machen ist. So
funktioniert es nicht.
echo <
Am Freitag, 28. November 2003 17:46 schrieb Al Bogner:
Die Umleitung Zeile für _Zeile_ in ein neues Script ist also vermutlich gar nicht notwendig. Man könnte also vielleicht mit dem "here"-Befehl den 1. Teil des Scripts (ca. 20 Zeilen) in die 2 Dateien umleiten, dann mit "if" den mkisofs-Teil in die jeweilige Datei und letztlich den Rest des Scripts an beide Dateien anhängen.
Ich habe nur noch nicht rausgefunden, wie das genau zu machen ist. So funktioniert es nicht.
echo <
testscript.txt zeile1 zeile2 END_OF_SCRIPT
Problem gelöst. Es muß cat und nicht echo heißen. Mit dieser Lösung erreiche ich nun genau das, was ich will. Al
Hallo Al, * Al schrieb am 28.11.2003:
Am Donnerstag, 27. November 2003 23:52 schrieb Al Bogner:
$befehl | tee datei1 > datei2 wenn nicht.
Jaaa! Das funktioniert so wie ich es mir vorstelle.
Mit dem Quoten habe ich aber noch ein Problem.
So funktioniert es: echo 'RECHNER=`uname -n`' | tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD
Wenn ich nun ein Variable definiere, die etwa so aussieht: VAR="| tee -a $SCRIPTISO1LFD >> $SCRIPTISO3LFD"
dann funktioniert echo 'RECHNER=`uname -n`' $VAR nicht.
Wie ist richtig zu quoten?
eval echo 'RECHNER=`uname -n`' $VAR Ich habe ja schön öfters einen Award gewonnen (Useless use of cat), aber gibts dafür auch einen? Vielleicht "Subs don't bother me"? Verwende lieber ne Unterroutine, der Du den Befehl übergibst. Diese schmeisst es dann in $SCRIPTISO1LFD und $SCRIPTISO3LFD. Oder zwei Unterroutinen, oder wenns sein muss sogar drei oder mehr ;-)) Grüße, Tom
Am Donnerstag, 27. November 2003 15:02 schrieb Al Bogner:
Wie leite ich in _2_ Textdateien mit > bzw. >> gleichzeitig um?
Also ls soll zB in datei1.txt und datei2.txt umgeleitet werden. Ich benötige das für die Generierung von 2 fast identen Scripts durch ein Script.
$ man tee -- Andreas
participants (8)
-
Al Bogner
-
Alfred Reinhard
-
Andreas Winkelmann
-
Axel Heinrici
-
Jan.Trippler@t-online.de
-
Peter Wiersig
-
Thomas Preissler
-
Thorsten Haude