Mailinglist Archive: opensuse-de (6551 mails)

< Previous Next >
Re: bash Probleme
  • From: Christian Boltz <christian.boltz@xxxxxxxx>
  • Date: Sun, 4 Aug 2002 23:40:01 +0200
  • Message-id: <200208042303.29960@xxxxxxxxxxxxxxx>
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.

< Previous Next >
Follow Ups
References