Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Einsteigerfrage zu Shellprogrammierung

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
flo2



Anmeldungsdatum: 27.05.2002
Beiträge: 46

BeitragVerfasst am: 26. Okt 2002 10:50   Titel: Einsteigerfrage zu Shellprogrammierung

Hallo,

ich habe folgendes Problem: Ich will ein Shellscript schreiben, das alle Dateien in einem Verzeichnis mit der Endung *.pid löscht. Das ganze soll natürlich nur erfolgend, wenn solche Dateien vorhanden sind. Ich habe folgendes versucht:

Erste Versuche natürlich mit test -e bzw. -f. Also if test -f *.pid Ist der Gebrauch von Wildcards bzw. Platzhaltern bei diesem Befehl zulässig?

Zweiter Versuch mit "if find -name *.pid -print -exec rm {} ; Problem: Der if Zweig (=Löschen) wird auch ausgeführt, wenn überhaupt keine pid-Dateien gefunden werden. find liefet wohl immer ein true zurück.

Gibt es sonst noch eine funktionierende Lösung?

Danke
Flo
 
Benutzer-Profile anzeigen Private Nachricht senden

tkortkamp



Anmeldungsdatum: 08.04.2001
Beiträge: 143
Wohnort: Bremen

BeitragVerfasst am: 26. Okt 2002 12:26   Titel: Re: Einsteigerfrage zu Shellprogrammierung

Hi!

Also am einfachsten ist es doch
code:
rm -f *.pid
zu benutzen. Die -f Option ignoriert nicht-existierende Dateien und veranlasst rm niemals irgendwas nachzufragen.

c ya,
Tobias
 
Benutzer-Profile anzeigen Private Nachricht senden

Flo
Gast





BeitragVerfasst am: 26. Okt 2002 12:30   Titel: Re: Einsteigerfrage zu Shellprogrammierung

Hallo,

ok, das stimmt natürlich. Nur bin ich nicht 100% damit zufrieden, weil das rm Kommando auch aufgrerufen wird, wenn überhaupt keine .pid Dateien vorhanden sind. Ich würde gerne unnötige Aufrufe verhindern.

Grüße
Flo
 

Kurt
Gast





BeitragVerfasst am: 26. Okt 2002 12:40   Titel: Re: Einsteigerfrage zu Shellprogrammierung

> Ich würde gerne unnötige Aufrufe verhindern.
Warum? Das spielt doch keine Rolle, ob rm nun aufgerufen wird oder nicht. Wenn du es mit test oder find machst, werden diese Programme auch aufgerufen...
 

Flo
Gast





BeitragVerfasst am: 26. Okt 2002 12:47   Titel: Re: Einsteigerfrage zu Shellprogrammierung

Hallo,

dass ein möglicherweise unnötiger Aufruf von rm nicht gerade viel Zeit des Prozessors in Anspruch nimmt, ist mir schon klar. Aber es interessiert mich einfach, ob das Überprüfen mehrer Dateien auf ihr Vorhandensein möglich ist.

MfG
Flo
 

ratttengift
Gast





BeitragVerfasst am: 26. Okt 2002 21:51   Titel: Re: Einsteigerfrage zu Shellprogrammierung

hallo,
wie kurt bereits sagte, ist die "rm -f"-variante die effizienteste. wenn es dir aber um den lerneffekt geht, könntest du zb folgendes machen.
code:

for DATEI in *.pid; do
echo $DATEI wird gelöscht
rm $DATEI
done


wie gesagt, das ist unnötig umständlich, aber vom lerneffekt her vielleicht brauchbar.

> Zweiter Versuch mit "if find -name *.pid -print -exec rm {} ;
> Problem: Der if Zweig (=Löschen) wird auch ausgeführt, wenn überhaupt keine pid-Dateien gefunden werden.

das ist auch keine richtige if-struktur. so gehts einfacher: rm $(ls *.pid)
in diesem fall werden nur die files behelligt, die wirklich existieren (wie bei rm -f natürlich auch )
rm wird also nur auf die files angewendet, die vom ls-command geliefert werden.
 

Jochen
Gast





BeitragVerfasst am: 27. Okt 2002 16:34   Titel: Re: Einsteigerfrage zu Shellprogrammierung

@rattengift:

Deine for-Schleife wird immer mind. einmal durchlaufen. Weshalb? Die Filename-Substitution der Shell greift nur, wenn es auch tatsächlich Dateien gibt, auf die das Muster passt. Existieren keine Treffer, wird die Zeichenfolge (hier "*.pid") unverändert stehen gelassen. Die Liste der Elemente für die for-Schleife ist also entweder die Liste der Dateien, die auf .pid enden, oder aber die Zeichenfolge "*.pid".
Und wenn man ein "rm $(ls *.pid) verwendet und es sind keine solchen Dateien vorhanden, erhält man direkt 2 Fehlermeldungen: 1. Von ls, da er Daten zu einer Datei "*.pid" nicht anzeigen kann, und dann von rm, weil ihm die Argumente fehlen (die Meldung von ls landete als Fehlermeldung natürlich auf stderr und wird daher auch nicht durch $() als Argument zu rm eingesetzt).

@Flo:

"rm -f *.pid" ist die "korrekte" Version, sprich die einfachst mögliche und schnellstverstandene. Performance ist bei Shell-Skripten meist nicht erste Priorität. Sollte tatsächlich ein Problem in der Laufzeit des Skriptes bestehen, wird es sicher nicht in dem Aufruf eines einzigen externen Programmes bestehen. Meist wird dann eher in handgeschnitzten Schleifen mehrere externe Programme über viele Dateien gehetzt - dort sollte man ansetzen.

Um nun aber eine korrekte Lösung anzubieten:
code:
if [ -z "$(ls *.pid 2>/dev/null)" ] ; then
echo "Keine PID-Dateien vorhanden"
else
echo "Löschen PID-Dateien"
rm *.pid
fi


Wenn der Rückgabewert des test-Kommandos (hier als [ geschrieben) gleich 0 ist, wird der then-Zweig durchgeführt, sonst der else-Zeig. Das test-Kommando prüft, ob die Zeichenkette, die ls zurückliefert, die Länge 0 hat (-z, zero length). Damit die Shell eine leere Ausgabe nicht wegoptimiert, müssen Anführungszeichen um die Kommandosunstition $() gesetzt werden.

Wie Du siehst, ein Sturm im Wasserglas. Bleib besser bei "rm -f" .

Jochen
 

Flo
Gast





BeitragVerfasst am: 27. Okt 2002 17:25   Titel: Re: Einsteigerfrage zu Shellprogrammierung

Ein Dank geht an alle! Ich werde mich wohl doch für rm -f Methode entscheiden.

MfG
Flo
 

LBS
Gast





BeitragVerfasst am: 31. Okt 2002 9:53   Titel: Re: Einsteigerfrage zu Shellprogrammierung

@Jochen
wieso schreibst Du bei der Kommandosubstitution $() hat das irgendwelche vorteile gegenüber den ` Backticks?

cu

____________________________
Linux Based System
 

Jochen
Gast





BeitragVerfasst am: 31. Okt 2002 11:10   Titel: Re: Einsteigerfrage zu Shellprogrammierung

@LBS:

Tja - es gibt Vor- und Nachteile. Im Prinzip sind die beiden Schreibweisen gleichwertig.


  • Vorteile

    $() ist schachtelbar; Backticks nicht.

    Dis Syntax passt logisch gut in die Shell-Syntax: Werden Kommandos in runden Klammern gruppiert, werden diese in einer eigenen Shell ausgeführt. Stellt man $ vor einen Variablennamen, wird dort der Inhalt der Variable eingefügt. Stellt man also $ vor (), wird dort die Ausgabe der Kommandos in den runden Klammern eingefügt.

    Die Backticks sind fallen weniger auf und sind daher m.E. weniger gut lesbar.


  • Nachteile

    $() ist nicht rückwärtskompatibel zur Bourne-Shell, welche nur die Backticks kennt. (Allerdings verstehen sowohl bash als auch ksh/pdksh "$()").

    Man muss ein Zeichen mehr tippen.

    Wenn man tatsächlich schachtelt, wird es schnell unübersichtlich.


    Jochen
  •  

    Beiträge vom vorherigen Thema anzeigen:   
         Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
    Seite 1 von 1

     
    Gehen Sie zu:  

    Powered by phpBB © phpBB Group
    pro_linux Theme © 2004 by Mandaxy