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:
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 ;-)
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
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 ;-)
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.
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 > |