ubuntuusers.de

Aufruf-Counter eines Shell-Skriptes als Parameter

Status: Gelöst | Ubuntu-Version: Xubuntu 16.04 (Xenial Xerus)
Antworten |

KeyzerSoze

Anmeldungsdatum:
28. September 2014

Beiträge: 120

Hallo ubuntuusers,

ich habe bsw. dieses minimale Bash-Skript: date.sh

#!/bin/bash
date
other_commands

In einem anderen Shell-Skript (main.sh) inkludiere ich manuell dieses Shellskript unregelmäßig, bsw. so:

./irgentetwas.sh
./date.sh
./irgentetwas2.sh
./irgentetwas3.sh
./date.sh
./irgentetwas4.sh
./date.sh
./irgentetwas5.sh
./irgentetwas6.sh
./irgentetwas7.sh
./date.sh
./irgentetwas8.sh

Nun möchte ich, dass dieses Skript (date.sh) weiß, zum wie vielten Mal es aufgerufen wurde. Nämlich soll ein Befehl (ein Parameter) in diesem Skript (date.sh) abhängig von der Aufrufhäufigkeit dieses Skriptes sein.

Wie könnte man das realisieren? Wäre es möglich einen globalen Parameter im main.sh-Skript zu definieren, der durchzählt wie oft das Programm aufgerufen wird und diesen Wert dem Programm übergibt? Oder kann man das viel einfacher realisieren?

Vielen Dank && viele Grüße

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Rein logisch gesehen läge die Aufgabe eigentlich bei Deinem main.sh - Skript, darüber Buch zu führen, wie oft es das date.sh - Skript aufruft.

Denn "Parameter" im eigentlichen Sinn sind die Optionen, die das aufrufende Skript seinem Kinde mitgibt. (und nicht umgekehrt)
Auch das Environment (→ die Variablen) wird vom Eltern-Skript an das Kind vererbt, und nicht umgekehrt.

Wenn das Kind also über sein Ableben hinaus über irgend etwas Buch führen soll, dann bliebe letztlich nur die Möglichkeit, diese Daten in einer Datei zu speichern. (wobei das Kind dann womöglich auch noch zu ermitteln hätte, von wem es aufgerufen worden ist !)

Meine Frage also: warum muss hier ausgerechnet das Kind darüber Buch führen, wie oft und von wem es aufgerufen worden ist ?
Anders herum wäre es viel einfacher und naheliegender.

LG,

track

KeyzerSoze

(Themenstarter)

Anmeldungsdatum:
28. September 2014

Beiträge: 120

Hallo track,

ja das macht Sinn, was Du sagst, bzw. keinen Sinn so wie ich es machen wollte.

Dann kann ich ja einfach in der main.sh

a=0

definieren, und in date.sh

a++

an den Anfang setzen. Oder eben mit Zwischenspeicherung.

Irgendwie habe ich viel zu kompliziert gedacht ☹

Naja, jedenfalls vielen Dank und einen schönen Abend ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

KeyzerSoze schrieb:

... und in date.sh

a++

an den Anfang setzen.

Und genau das klappt ganz sicher nicht !

denn wie ich oben schon sagte: das Kind erbt sein Environment vom Elternprozess, kann aber nur auf sein eigens Environment, aber niemals (!) auf das seiner Eltern zugreifen.
Also: entweder lässt Du komplett im Elternskript hochzählen, oder Du müsstest das Kind ausdrücklich über den source-Befehl aufrufen. Dann läuft es komplett im Environment der Eltern, und kann dort nach Belieben herumfuhrwerken. (mit allen Vor- und Nachteilen !)

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

Vorschlag:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20

date_count=0

date() {
  date_count=$((date_count + 1))
  $(dirname "$0")/date.sh $date_count
}

./irgentetwas.sh
date
./irgentetwas2.sh
./irgentetwas3.sh
date
./irgentetwas4.sh
date
./irgentetwas5.sh
./irgentetwas6.sh
./irgentetwas7.sh
date
./irgentetwas8.sh

KeyzerSoze

(Themenstarter)

Anmeldungsdatum:
28. September 2014

Beiträge: 120

Okay, ich war wohl etwas voreilig den Beitrag als gelöst zu markieren ☺ Aber jetzt ist er es definitiv.

track schrieb:

Also: entweder lässt Du komplett im Elternskript hochzählen, oder Du müsstest das Kind ausdrücklich über den source-Befehl aufrufen. Dann läuft es komplett im Environment der Eltern, und kann dort nach Belieben herumfuhrwerken. (mit allen Vor- und Nachteilen !)

Also so, wenn ich das richtig verstanden habe: In das date.sh-Skript in die 2. Zeile einfach ein

source main.sh

schreiben. Jedenfalls klappt dieser Weg ☺)

rklm schrieb:

date() {
  date_count=$((date_count + 1))
  $(dirname "$0")/date.sh $date_count
} 

Klappt auch ☺ Mit dem dirname verlinke ich das Skript in der Funktion (indem ich so den Pfad mitteile), das ist mir klar. Aber was macht der Parameter

$date_count

? Ist das ein Argument, das übergeben wird? Um den Wert zu sehen, muss ich dieser Funktion ja bsw.

echo "$date_count"

hinzufügen. Ich finde diesen Ansatz mit der Funktion ziemlich elegant ☺

Danke allen Beteiligten!! ☺ Einen schönen Abend wünsche ich!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

KeyzerSoze schrieb:

Um den Wert zu sehen, muss ich dieser Funktion ja bsw.

echo "$date_count"

hinzufügen.

Nein, denn alle Variablen in einem Shell-Skript sind global, es sei denn es handelt sich um die bash und man deklariert sie in einer Funktion explizit als local.

Ich finde diesen Ansatz mit der Funktion ziemlich elegant ☺

Ja, Shell-Funktionen sind ganz nützlich. Die kann man sogar interaktiv nutzen als eine erweiterte Form von Aliasen.

Antworten |