WinFuture-Forum.de: [gelöst]Fehler in der Bash - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

[gelöst]Fehler in der Bash Wo ist denn jetzt schon wieder mein Denkfehler.


#1 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 11. Februar 2013 - 22:19

Ich eine kleine Bashdatei (um)geschrieben und zwar damit Sie eine festgelegte Anzahl von Durchläufen macht.

#!/bin/bash

durchlauf=1

while [ $durchlauf -lt 3 ] ; do

#Hier passiert dann allerhand

sleep 10

(( durchlauf += 1 ))

done

exit 0



Wenn ich das Script ausführbar mache und doppelklicke, dann funktioniert es so wie es soll. Starte ich es aber in der Shell mit

sh blablabla.sh

dann funktioniert es nicht. Dann kriege ich die Fehlermeldung

Desktop/blablabla.sh: 57: durchlauf: not found

und die Zeile 57 ist die, in der das "done" steht. Das kann doch nur eine Kleinigkeit sein, die ich irgendwo übersehen habe.

Dieser Beitrag wurde von Holger_N bearbeitet: 12. Februar 2013 - 11:50

Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

Anzeige



#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 11. Februar 2013 - 22:25

Es fehlt ein let.


let durchlauf++




oder ähnliches.

Was aber auch geht:


limit=10;

for ((i=1; $i<=$limit; i++ )); do
   echo $i;
done;



EDIT ~ Klingt auch, als würde Dein Script mit verschiedenen sh-Interpretern ausgeführt; ist die sh von der Kommandozeile dieselbe, die in der shebang angegeben ist?

Dieser Beitrag wurde von RalphS bearbeitet: 11. Februar 2013 - 22:27

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#3 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 11. Februar 2013 - 22:31

Na das Hochzählen klappt mit

(( durchlauf += 1 ))

eigentlich ganz gut so lange ich das Script per Doppelklick starte. Irgendwo besteht wohl ein Unterschied zwischen Doppeklick- und Shellstart.


Das mit den Interpretern klingt aber schonmal nicht schlecht. Wer ist denn Shebang?

Dieser Beitrag wurde von Holger_N bearbeitet: 11. Februar 2013 - 22:34

Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#4 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 11. Februar 2013 - 22:35

Shebang = #! Zeile. Bei Dir /bin/bash.

Ich *vermute* mal, daß sh = ash oder sowas ist, welche inkompatibel mit bash ist.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#5 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 11. Februar 2013 - 22:42

Na das muß sich doch dann mit diesem Interpreter in der Shell auch starten lassen. So mit anderen Buchstaben als sh. Also wenn ich Doppelklicke, kommt ja die dieses Auswahlding, wo man anklicken kann "im Terminal ausführen" und wenn man das anklickt, geht ja auch diese Konsole auf und das Script läuft absolut vorbildlich.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#6 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 11. Februar 2013 - 22:48

Ja, klar. Mit "bash blablabla.sh".

- Auf die Erweiterung kannst Du übrigens, zumindest unter Linux&Co, verzichten.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#7 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 11. Februar 2013 - 22:58

Ha - so einfach - ich Ochse hatte beim Versuch mit bash den Pfad mit /Desktop/blablabla.sh angegeben und mit dem Slash am Anfang gings natürlich nicht. Allerdings ohne Erweiterung gehts auch nicht. Jetzt muß ich nur noch gucken, wie man das beenden kann.

Mal angenommen das läuft nicht mit einer festgelegten Anzahl von Durchläufen, sondern als Endlosschleife. Wenn es dann in der Shell läuft kann man es ja mit Strg+c stoppen aber wie stoppt man das, wenn es alleine läuft?
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#8 Mitglied ist offline   DK2000 

  • Gruppe: Administration
  • Beiträge: 19.794
  • Beigetreten: 19. August 04
  • Reputation: 1.434
  • Geschlecht:Männlich
  • Wohnort:Oben auf dem Berg
  • Interessen:Essen, PC, Filme, TV Serien...

geschrieben 11. Februar 2013 - 23:03

War da nicht noch etwas mit einem .?

./Desktop/blablabla.sh

Oder gibt es da nicht mehr`Kann mich da dunkel dran entsinne, dass ich da einen . davor angeben musste, ansonsten liefen die Scripte nicht. Aber ist schon so lange her. Muss mal wieder Linux irgendwo installieren.
Ich bin kein Toilettenpapier-Hamster.
---
Ich bin ein kleiner, schnickeldischnuckeliger Tiger aus dem Schwarzwald.
Alle haben mich ganz dolle lila lieb.
0

#9 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 11. Februar 2013 - 23:06

Nee funktioniert ja alles soweit. Also das Script läuft. Ich hatte nur einen Fehler während der Laufzeit, der wie sich ja rausstellte einfach nur bei einem Interpreter auftrat und beim Anderen nicht.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#10 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 11. Februar 2013 - 23:12

DK: Man kann das ./ vorn auch weglassen, ist dasselbe wie unter Windows "cmd .\datei.cmd".

Aber im Gegensatz zu Windows gehört PWD nicht implizit zum Suchpfad. "blablaba.sh" funktioniert so nur, wenn es im Suchpfad steckt - das aktuelle Verzeichnis reicht nicht aus. Dafür braucht man tatsächlich ./blablabla.sh .

Wie man's beendet - wenn es ein Terminal gibt wo's drin läuft, geht Crtl-C. Wenn nicht, kann man's mit killall abschießen

killall blablabla.sh



wenn man's direkt gestartet hat; wenn mit "bash blablabla.sh" geht das aber nicht - killall würde dann sämtliche laufenden bash-Prozesse beenden.
Du müßtest also sowas wie
ps aux | grep blablabla


ausführen, wissen, welche Spalte die PID ist (ps aux | head -n1) und dann diese PID abschießen mit
kill -HUP <pid>



Wofür soll denn das Script in einer Endlosschleife laufen?

Dieser Beitrag wurde von RalphS bearbeitet: 11. Februar 2013 - 23:16

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#11 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 11. Februar 2013 - 23:54

Beitrag anzeigenZitat (RalphS: 11. Februar 2013 - 23:12)


Wofür soll denn das Script in einer Endlosschleife laufen?


Na ich weiß nicht, ob du das gestern mitgelesen hattest. War mehr so aus Spaß, ich hab mir ein Script gesucht und bastel es gerade meinen Bedürfnissen entsprechend um. Ich lade mir in einem vorgegebenen Intervall Bilder von einer Webcam runter und speichere die weg. Wenn man nun auf eine Ereignis wartet, was nicht genau vorhersehbar ist, dann könnte man das Script starten, unbeaufsichtigt als Endlosschleife laufen lassen und guckt nur ab und zu mal nach, ob es schon passiert ist (Lawinenabgang oder Ähnliches) und wenn mann dann sieht "Aha- Lawine unten", dann beendet man das Ganze.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#12 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 12. Februar 2013 - 00:07

Mh.

Da würde eine while() Schleife schon passen.

while true; do
    wget -P <speicherort> <URL>;
    sleep <seconds>;
done;



Wenn Du lustig bist, nimmst Du nicht true, sondern holst Dir mit
declare -i platz=$(du -s <speicherort> | tr '\t' ' ' | cut -d' ' -f1);


den bereits belegten Platz in kBytes (als Integer) und vergleichst das mit einer Höchstgrenze, also

declare -i hoechstgrenze=$((100 * 1024)); # 100 MB
declare -i platz=$(du -s <speicherort> | tr '\t' ' ' | cut -d' ' -f1);

while [ $platz -lt $hoechstgrenze ]; do
    wget -P <speicherort> <URL>; # Action
    sleep <seconds>; # Warte <seconds> Sekunden bis zum nächsten Durchlauf
    declare -i platz=$(du -s <speicherort> | tr '\t' ' ' | cut -d' ' -f1); # Aktualisiere $platz
done;


dann schreibt Dir das Ding nicht hemmungslos die Platte voll.

Dieser Beitrag wurde von RalphS bearbeitet: 12. Februar 2013 - 00:10

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#13 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 12. Februar 2013 - 00:38

Na das Script hab ich ja. Meins sieht so aus.

#!/bin/bash

start=1
anzahl=100
interval=10
stellen=4

bildpfad='http://bildpfad.jpg'
speicherpfad='/Pfad/zum/Speicher'

limit=$(($anzahl+$start))
while [ $start -lt $limit ] ; do
cd $speicherpfad
zahl=$(printf "%.${stellen}i" $start)
image=bild_$zahl.jpg
wget -O $image $bildpfad
sleep $interval
let start++
done
exit 0




Vielleicht mach ich auch etwas kürzere Intervalle als die Webcam jeweils hat und bau dann mit cmp einen Vergleich mit vorangegangen Bildern und lösche doppelte. Dann geht mir keins durch die Lappen und ich hab keine doppelt. So bin ich aber erstmal ganz zufrieden bzw. überrascht, wie simpel das war. Also dafür, dass ich jahrelang überlegt habe, ob es nicht ein Programm für sowas gibt.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#14 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 12. Februar 2013 - 00:49

Mh, seh jetzt nicht, warum da keine for() Schleife verwendet wurde, ist ja nun ganz normal beschränkt durch

for (( i=$start;$i<=$limit+$start;i++ )); do ... done;



Aber, funktionieren sollte es so.

Tip: wget -P <prefix> spart den Verzeichniswechsel.

~ Liefert denn die Cam bitidentische Daten für identische Bilder? Ist natürlich eher nebensächlich; aber wenn nicht, kannst Du Dir jeden cmp() sparen.

Dieser Beitrag wurde von RalphS bearbeitet: 12. Februar 2013 - 00:54

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#15 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 12. Februar 2013 - 09:04

Beitrag anzeigenZitat (RalphS: 12. Februar 2013 - 00:49)

Mh, seh jetzt nicht, warum da keine for() Schleife verwendet wurde, ist ja nun ganz normal beschränkt durch

Ich will mir die Option der Endlosschleife ja auch noch offen halten. Da finde ich das (vom Gefühl her) sauberer, den Inhalt der eckigen while-Klammer durch true zu ersetzen, statt die for-Schleife dafür umzubiegen.

Beitrag anzeigenZitat (RalphS: 12. Februar 2013 - 00:49)

~ Liefert denn die Cam bitidentische Daten für identische Bilder? Ist natürlich eher nebensächlich; aber wenn nicht, kannst Du Dir jeden cmp() sparen.


Ja ich meine ja nicht mit "gleichen Bildern" , dass auf dem Bild nix passiert, sondern dass ich ein Bild tatsächlich zweimal abhole, weil mein Intervall schneller ist als das der Webcam. Die sind ja dann bitidentisch bzw. es ist ja zweimal das gleiche Bild.

Also beispielsweise wird auf der Webseite im 20 Sekunden-Rhythmus aktualisiert und ich rufe im 15 Sekunden-Rhythmus ab und lösche aber gleich die Dopplungen. So geht mir nix durch die Lappen.

Dieser Beitrag wurde von Holger_N bearbeitet: 12. Februar 2013 - 09:08

Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

2 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 2, unsichtbare Mitglieder: 0