• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

script ausführen -> wie?

search

Newbie
hallo zusammen

habe folgendes script geschrieben. zuerst soll ein directory getart, danach gezipt werden. besteht auch die möglichkeit dies in einem schritt zu tun?
wollte dieses zum testen nun mal ausführen. was muss ich jedoch machen das es ausführbar wird oder wo liegt der fehler im script? bekomme folgendes als meldung zurück:

: bad interpreter: No such file or directory

die verzeichnisse existieren jedoch alle. hier mal ein auszug vom script:

Code:
#!/bin/sh

BACKUP_DIR=/mnt/backup/
REPOSITORY_DIR=/home/test
REPOSITORY_NAME=test

cd $REPOSITORY_DIR
TARFILE=tarBackupFile.tar
ZIPFILE=`date +%Y%m%d%H%M`_backup.zip
tar -cvf $TARFILE $REPOSITORY_NAME

zip -r $ZIPFILE $TARFILE 

rm $TARFILE
mv $ZIPFILE $BACKUP_DIR

danke & gruss
 

TeXpert

Guru
zu dem Startproblem hat admine ja schon was angemerkt, jetzt zu der Kompressionsfrage:

1. tar und zip muss nicht sein, denn zip ist in der Lage Verzeichnisbäume zu archivieren, d.h. es reicht, wenn Du nur zipst.also:
Code:
zip -r $ZIPFILE $REPOSITORY_NAME

2. wenn mit tar, dann nimm gzip oder bzip, die komprimieren ein einzelnes File und gnu tar kann mit denen umgehen:
Code:
ZIPFILE=`date +%Y%m%d%H%M`_backup.tar.gz
tar cvzf $ZIPFILE $REPOSITORY_NAME
oder bzip:
Code:
ZIPFILE=`date +%Y%m%d%H%M`_backup.tar.bz2
tar cvjf $ZIPFILE $REPOSITORY_NAME
 
OP
S

search

Newbie
hallo zusammen

danke für die schnellen antworten.

yup starte es vom verzeichnis aus mit ./scriptname

habe nochmals alle pfade überprüft. die sollten stimmen. wo ist es den sinnvoll solche scripts zu speichern und zu starten? möchte es später über einen cronjob laufen lassen.

danke & gruss
 

admine

Ultimate Guru
search schrieb:
yup starte es vom verzeichnis aus mit ./scriptname
dann versuche mal als Interpreter die bash zu setzen (#!/bin/bash)
search schrieb:
wo ist es den sinnvoll solche scripts zu speichern ...? möchte es später über einen cronjob laufen lassen.
eigentlich egal ... wenn du beim Cron-Job dann den vollständigen Pfad zum Script angibst.
Oder aber in einem Verzeichnis, welches in der PATH-Variable steht.
z.B.: $HOME/bin
 
OP
S

search

Newbie
habe ich auch schon probiert mit /bin/bash. macht keinen unterschied. immer noch die gleiche meldung. wenn ich das script mit bash scriptnahme ausführe bekomme ich folgende meldung:

: command not found
: command not found
: command not found
: command not found

was auch immer das zu bedeuten mag. hatte auch mal alles auskommentiert um nur eine zeile auszuführen. macht jedoch auch keinen unterschied. erhalte immer noch die selbe meldung. sonst noch ne idee?

danke & gruss
 
OP
S

search

Newbie
ja das war ganz afangs auch mal noch eine frage was ich denn überhaupt machen muss das das script ausführbar wird. das script habe ich 1 zu 1 kopiert so wies oben steht und chmod +x scriptname.sh durchgeführt. danach habe ich es mit ./scriptname ausgeführt. mehr habe ich nicht gemacht. was muss ich denn sonst noch machen?
 

admine

Ultimate Guru
search schrieb:
ja das war ganz afangs auch mal noch eine frage was ich denn überhaupt machen muss das das script ausführbar wird. das script habe ich 1 zu 1 kopiert so wies oben steht und chmod +x scriptname.sh durchgeführt. danach habe ich es mit ./scriptname ausgeführt. mehr habe ich nicht gemacht. was muss ich denn sonst noch machen?
ähm ... wenn dein Script scriptname.sh heißt, dann musst du es auch so ausführen:
Code:
./scriptname.sh
 
OP
S

search

Newbie
yup habe ich auch :)

macht trotzdem keinen unterschied. habe jetzt mal ganz ein simples script geschrieben:

#!/bin/bash
echo "test"

wenn ich das nun wie folgt ausführe ./script.sh bekomme ich folgenden fehler:

: bad interpreter: Datei oder Verzeichnis nicht gefunden

wenn es hingegen so auführe bash script.sh funktionierts und test wird ausgegeben auf der konsole.

aber ist das script so überhaupt möglich wie ich das anfangs geschrieben habe. sind das alles zulässigen tags? kann das vielleicht jemand bei sich mal schnell ausprobieren?

vielen dank, gruss
 
OP
S

search

Newbie
khm... habe den fehler glaube ich gefunden. hatte das script auf windows in einem editor erstellt. das hat dem script nicht so gut getan. habs nun im vi nochmals neu geschrieben und das schaut schon besser aus :) habe nur noch eine frage betreffend der tar und zip dateien welche ich erstelle. wenn ich das script ausführe haben beide dateien am ende ein ? angefügt. wieso ist das so? also dateiname.zip? und dateiname.rar? wie müsste ich das denn anders schreiben?

danke & gruss

edit: auf der konsole wird das file wie folgt dargestellt: dateiname.zip^M? wieso das denn?
 

admine

Ultimate Guru
search schrieb:
khm... habe den fehler glaube ich gefunden. hatte das script auf windows in einem editor erstellt. das hat dem script nicht so gut getan. habs nun im vi nochmals neu geschrieben und das schaut schon besser aus :)
grrrrrrrrrr ... wollte schon sagen, bei mir funzt das so.
search schrieb:
habe nur noch eine frage betreffend der tar und zip dateien welche ich erstelle. wenn ich das script ausführe haben beide dateien am ende ein ? angefügt. wieso ist das so? also dateiname.zip? und dateiname.rar? wie müsste ich das denn anders schreiben?
ist bei mir auch in Ordnung ... :roll:
 

TeXpert

Guru
das deutet auch auf einen Encoding-Fehler hin...

an sich sollte das _sauber-geschrieben_ so laufen, also ohne Windows-Zeilenümbrüche etc.
 
OP
S

search

Newbie
hmm... hab mir das ganze nochmals angeschaut. finde irgendwie keine fehler mehr. kann das script nun immerhin ausführen. bekomme aber dann beim erstellen des zip files immer folgenden fehler:

zip warning: name not matched: +%Y%m%d%H%M_repositoryBackup.zip
updating: tarBackupFile.tar (deflated 99%)

im script sieht die zeile wie folgt aus:

ZIPFILE='date +%Y%m%d%H%M'_repositoryBackup.zip

ist das was falsch dran?

danke & gruss
 
Windows nutzt am Ende <cr><lf> also carriage return,linefeed
Unix nutzt nur <lf>

Wenn man so eine Windows-Datei mit vi öffnet steht unten
in der Statuszeile entweder "dos-mode" oder "^M" für <carriage return>

( man ascii )

Beim Start versucht Linux jetzt den Interpreter hinter "#!" zu finden.
/bin/bash<cr> wird aber nicht gefunden....

Hinweis zum Übertragen von DOS => UNIX dafür ist der "ascii"
mode. Im Gegensatz zum "bin/binary" mode wird dabei
<cr><lf> (dos) in <lf> (unix) übersetzt.

Das Ganze ist häßlich zu finden.
mit "od -c <file>" kann man sich das ganze mal als "od => oktal dump" anschauen.

Viele Grüße,

Haveaniceday
 
OP
S

search

Newbie
hmm... ok jetzt geht's glaube ich. habe ' anstatt ` verwendet. auch noch komisch das man ` nehmen muss. hab ich ja noch nirgens gesehen.

danke für eure hilfe

gruss
 
Code:
A="zuerst"
echo `echo $A`

Alles in "``" wird zuerst ausgeführt
gibt "zuerst" aus

Code:
A="zuerst"
echo "echo $A"
Bei " werden Variablen ersetzt und Befehle zwischen `` ausgeführt.

gibt "echo zuerst" aus.

Code:
A="zuerst"
echo 'echo $A'

gibt "echo $A" aus. Bei '' werden Variablen nicht ersetzt und Befehle zwischen `` nicht ausgeführt.

Haveniceday

PS: es gibt noch den Befehl "eval". Damit geht auch folgendes:
Code:
~> A=B
~> eval $A=C
~> echo $B
C
cv@ocv:~>

Edit:
set -x
=> Einschalten: Anzeige Befehl vor Ausführung
set +x
=> schaltet "-x" wieder aus.

Wenn man "set -x" in die zweite Zeile eines Shellskripts schreibt sieht man mehr.
Alternativ:
#!/bin/bash -x

[/edit]
 

TeXpert

Guru
bei den `` handelt es sich um die alte, klassische Form der "Command Substitution" (siehe man bash).

die aktuellere Variante ist $( ... ) insbesondere ist die Behandlung von Sonderzeichen bei der $( ... ) Variante sinnvoller ;) z.B.
Code:
$ echo \\
\
jetzt mit Command-Substitution:
Code:
$ echo $(echo \\)
\
$ echo `echo \\`

$ echo `echo \\\\`
\
bei den backticks muss der Backslash doppelt-excaped werden... da sonst bei einem \ die subshell beendet wird...
 
Oben