PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shellskriptprogrammierung



Miksch
15.10.06, 16:18
Hallo Forum! :)
Ich lerne gerade Shellskriptprogrammierung. Im Heft "Linux fuer Poweruser" aus dem Know Ware Verlag gibt es da ein Beispielskript, das folgende Funktionen haben soll:
- Wenn man eine Datei loescht, wird sie komprimiert in ein Archiv gepackt, bevor sie geloescht wird
- Man kann die Datei aus dem Archiv wieder herstellen
- Man kann den Inhalt des Archivs ansehen
Dazu ist folgendes Skript vorgesehen:

#! /bin/bash/
if [ "$0" = "$PWD/del" ]; then
if [ -z "$1" ]; then
echo "Benutzung: Del <Datei>"
exit
elif [ ! -f "$1" ]; then
echo "$1 ist keine Datei"
exit
fi
gunzip /home/michael/korb.tar.gz 2>/dev/null
tar -rf /home/michael/korb.tar $1 2>/dev/null
gzip /home/michael/korb.tar
fi
if[ "$0" = "$PWD/undel" ]; then
if [ -z "$1" ]; then
echo "Benutzung: undel <Datei>"
exit
elif [ -z $(tar -tzf /home/michael/korb.tar.gz | grep $1) ]; then
echo "$1 ist nicht im Papierkorb"
exit
fi
tar -xzf /home/michael/korb.tar.gz -c $PWD $1
fi
if [ "$0" = "$PWD/korb" ]; then
tar -tzf /home/michael/korb.tar.gz 2>/dev/null


Die Softlinks habe ich im Verzeichnis /home/bin mit

ln -s /home/bin/papierkorb.sh del
ln -s /home/bin/papierkorb.sh undel
ln -s /home/bin/papierkorb.sh korb erstellt.
Das Skript habe ich mit chmod 777 ausfuehrbar gemacht.
Leider bekomme ich immer wieder die Fehlermeldung:

bash: del: command not found fuer die anderen Befehle entsprechend.
Was ist an dem Skript, oder meinem Vorgehen falsch?
Hat jemand fuer mich einen Tipp?
TIA und viele Gruesse,
Miksch

Der Gestreifte
15.10.06, 16:42
Wie rufst Du das Skript den auf?
Steht "~/bin/" in $PATH?

rettichschnidi
15.10.06, 16:44
PATH=$PATH:/home/deinusername/bin

damit wird dein Script auch gefunden. Woher soll sonst die Shell wissen, wo ausführbare Dateien liegen?

Miksch
15.10.06, 16:45
Nein, ~/bin steht noch nicht im PATH, aber ich rufe das Skript direkt im Verzeichnis ~/bin mit dem Befehl "del", "undel" oder "korb" auf.
Gruss,
Miksch

Der Gestreifte
15.10.06, 16:46
Nein, ~/bin steht noch nicht im PATH, aber ich rufe das Skript direkt im Verzeichnis ~/bin mit dem Befehl "del", "undel" oder "korb" auf.
Das nützt nichts, weil die Shell dann immer noch nicht weiß, wo sich der Befehl befinden könnte.
Wenn, dann
./befehl

drcux
15.10.06, 16:46
Nein, ~/bin steht noch nicht im PATH

Und deswegen musst du es mit Pfad aufrufen, also ~/bin mit in PATH...

Miksch
15.10.06, 16:54
...das hilft leider alles noch nichts. Ich habe ~/bin in den PATH eingetragen, habe del auch mit ./del aufgerufen, dennoch ist die Ausgabe immer die Gleiche:

bash: ./del: /bin/bash/: bad interpreter: Ist kein Verzeichnis

Gruss,
Miksch

Detrius
15.10.06, 16:57
#!/bin/bash ;)

Miksch
15.10.06, 16:59
...macht leider auch keinen Unterschied.
Miksch

Detrius
15.10.06, 17:05
Es kommt die gleiche Fehlermeldung obwohl Du das Skript entsprechend geändert hast?

Was sagt denn "ls -l /bin/bash"?

Der Gestreifte
15.10.06, 17:44
./del aufgerufen, dennoch ist die Ausgabe immer die Gleiche:Lass mich raten.
Du hast das Skript per copy'n'paste erstellt?
Dann ein mal dos2unix drüber laufen lassen.
Oder mit "sh ./sksript.sh" aufrufen.

Miksch
15.10.06, 18:01
...sorry, hatte Besuch bekommen.
ls -l /bin/bash ergibt folgendes:

-rwxr-xr-x 1 root root 625228 2004-12-19 17:53 /bin/bash

Das Skript habe ich manuell, also ganz und gar selbst, erstellt.;)
...danach verglichen, mehr als einmal.
Habe uebrigens die Kommandos auch als root aufgerufen. Mit dem gleichen Misserfolg.
Gruss,
Miksch

Der Gestreifte
15.10.06, 18:10
Das Skript habe ich manuell, also ganz und gar selbst, erstellt.Trotzdem: was sagt "file skriptname"?

Miksch
15.10.06, 18:12
Der Skriptname lautet: papierkorbneu.sh

Kleinhirn
15.10.06, 18:17
Der Gestreifte meinte:

geh in eine Konsole, welchsle in das Verzeichnis wo das Skript liegt und gib folgendes ein:

file papierkorbneu.sh

Poste die Ausgabe

Miksch
15.10.06, 18:19
...achso ;).

papierkorbneu.sh: Bourne-Again shell script text executable


P.S.: Ich nutze debian 3.1 sarge, spielt das vielleicht eine Rolle bei dem Problem? Eigentlich duerfte das doch bedeutungslos sein, oder?

gmk
15.10.06, 18:29
Also ich hab jetzt mal dein Script hier lokal getestet:
Nach ausbessern der Fehler (»fi« in die letzte Zeile sowie in Zeile 14 (»if[ "$0" = "$PWD/undel" ]; then«) nach if ein Leerzeichen), läuft das Script zumindest (auch wenn es wahrscheinlich wegen den if-Bedingungen nur selten sinnvoll funktionieren würde)

#!/bin/bash
if [ "$0" = "$PWD/del" ]; then
if [ -z "$1" ]; then
echo "Benutzung: Del <Datei>"
exit
elif [ ! -f "$1" ]; then
echo "$1 ist keine Datei"
exit
fi
gunzip /home/michael/korb.tar.gz 2>/dev/null
tar -rf /home/michael/korb.tar $1 2>/dev/null
gzip /home/michael/korb.tar
fi
if [ "$0" = "$PWD/undel" ]; then
if [ -z "$1" ]; then
echo "Benutzung: undel <Datei>"
exit
elif [ -z $(tar -tzf /home/michael/korb.tar.gz | grep $1) ]; then
echo "$1 ist nicht im Papierkorb"
exit
fi
tar -xzf /home/michael/korb.tar.gz -c $PWD $1
fi
if [ "$0" = "$PWD/korb" ]; then
tar -tzf /home/michael/korb.tar.gz 2>/dev/null
fi

Der Gestreifte
15.10.06, 18:30
Dann fällt mir auch nur noch der von Detrius monierte Shebang ein.
Ist der wirklich
#!/bin/bash
Geht "sh skriptname.sh"?

edit:
Jetzt stimmt er zumindest.

Miksch
15.10.06, 18:45
Ganz herzlichen Dank Euch allen! gmk hatte den richtigen Dreh! :) :) :)
Nachdem ich das Skript von gmk in eine neue Datei kopiert habe, laeuft es auch, natuerlich, nachdem ich es aufuehrbar gemacht habe. Hingegen hatte es keinen Erfolg, dass ich meine eigene Datei veraendert habe. Da war wohl irgendwo der Wurm drin.
Euch allen einen schoenen Abend! ...meiner ist gerettet!
Viele Gruesse,
Miksch

L00NIX
15.10.06, 18:47
Was liefert $0?

Gib $0 mal vor den if-Abfragen aus.

Benutze bei Mehrfachverzweigungen case, da es übersichtlicher ist.

Benutze basename $0 statt $0 und lass den absoluten Pfad weg.

Ach ja: Dein Einrückungsstil ist unkonventionell!

Nur so ein paar Gedanken...

Gruß
L00NIx

Miksch
15.10.06, 18:51
Hallo Loonix :)
Ich habe einfach nur den Stil des Heftes nachempfunden. Von case habe ich noch keine Ahnung, das werde ich wohl noch lernen.
echo $0 gibt aber /bin/bash aus.
Das Andere werde ich hoffentlich noch lernen.;)
Trotzdem herzlichen Dank!
Miksch

P.S.: Wie sind denn die Konventionen fuer Einrueckungen?

L00NIX
15.10.06, 19:01
echo $0 gibt aber /bin/bash aus.


In der Shell eingegeben, JA. In dein Skript eingebaut, SICHER NICHT. ;)



P.S.: Wie sind denn die Konventionen fuer Einrueckungen?


Grundsätzlich ist es nicht falsch, ich finde es nur unübersichtlich eingerückt. Schau dir einfach mal Shell-Skripte an, die so in deinem System rumliegen.

Miksch
15.10.06, 19:12
mach ich...;)
Gute Nacht!
Miksch