Hallo Sascha, hallo Leute, Sascha, darf ich Dir ein paar Preise verleihen? Am Sonntag, 4. August 2002 18:11 schrieb Sascha Andres:
ich habe mir ein kleines Skript angefungen:
,----[ test.sh ]- | #! /bin/sh | | ps aux > .tmp
Das gibt erstmal den "Useless use of temp-file award" ;-) Außerdem ist es evtl. ein Risiko, einen so allgemeinen Namen für ein Tempfile zu verwenden (z. B. Überschneidung mit anderen Programmen/Scripten, Datenverlust durch "boshafte" SymLinks [1], ...) Apropos Tempfile: Die Datei .tmp wird bei Deinem Script im aktuellen Verzeichnis erstellt, was wohl nicht unbedingt sinnvoll ist. Für sowas gibt es ja schließlich /tmp ;-)
| running="FALSE" | cat .tmp | grep "java" | while read line
Hiermit verleihe ich Dir den "Useless use of cat award" ;-) Übrigens wirst Du garantiert immer TRUE erhalten, da zumindest die Zeile "grep java" von ps gelistet wird -> deshalb grep -v grep
| do | running="TRUE" | echo $running | done
Ach ja, einen "Useless use of while ... do ... done award" verleihe ich Dir auch gleich noch. Für diesen Zweck braucht man doch wirklich keine Schleife ;-)
| echo $running | rm .tmp `----
Soweit die Preisverleihung ;-) *SCNR* Als Kurzform (und nicht preisverdächtig ;-) würde ich folgendes Konstrukt empfehlen: #!/bin/sh running="FALSE" ps aux | grep java | grep -v grep > /dev/null && running="TRUE" echo $running Kurze Erklärung: - ps aux wird direkt an grep java [2] gepipt - die Ausgabe des ersten grep geht direkt an ein grep -v grep (würde man diesen Schritt auslassen, würde die Zeile grep java aus der ps-Ausgabe einen "false positive" erzeugen. - > /dev/null (also ins digitale Nirwana) geht das Ganze, weil mich nur der Exitcode (auch mit echo $? abzufragen) interessiert - && bedeutet, dass das Folgende nur ausgeführt wird, wenn der vorhergehende Prozess den Exitcode 0 hinterlassen hat [3] [4] - running="TRUE" setzt schließlich $running auf TRUE Ach so, die Variable $running könntest Du evtl. noch einsparen, indem Du das running="TRUE" gleich durch den Befehl ersetzt, der ausgeführt werden soll. (also ... && tue_etwas statt ... && running="TRUE") Allerdings kann das etwas unübersichtlich werden, falls Du mehrere Befehle ausführen möchtest. Für diesen Fall ist eine eigentlich überflüssige Variable die besser lesbare Lösung ;-) Gruß Christian Boltz [1] z. B. /tmp/.tmp -> /home/Mail/inbox :-| [2] grep java benötigt keine " um java - die brauchst Du nur, wenn der Suchtext Leerzeichen oder Sonderzeichen, die die Shell interpretieren möchte (z. B. * und ?) enthält. Wenn Dein Suchstring für grep auch ein $irgendwas enthält, wird die Verwendung von ' (Shift + #) als Quotingzeichen interessant, da die Bash bei grep "$text" $text durch den Inhalt der Variable $text ersetzt. grep '$text' sucht wirklich nach $text als Text. Wenn ein $ am Ende des Suchstrings steht, wird es übrigens als Zeilenende interpretiert. Um also z. B. nach test$ als Text zu greppen, rufst Du grep 'test\$' auf. [3] in diesem Fall der Prozess grep -v grep Exitcodes von grep: 0 - mindestens eine Fundstelle 1 - keine Fundstelle [4] Das Gegenteil von && ist übrigens || - dann wird der Rest der Zeile nur ausgeführt, wenn der Exitcode ungleich 0 ist -- Registrierter Linux-Nutzer #239431 Linux - life is too short for reboots.