Hi,
ich habe hier ein merkwürdiges problem. ich habe ein skript, das am anfang zunächst mal prüft, ob es gesourct aufgerufen wird oder nicht (um dann entsprechend anders zu reagieren). ich habe das damals durch einen vergleich [ "$0" = "/bin/bash" ] gelöst, und das skript lief auch jahrelang problemlos (auf ner suse-box).
nun wollte ich es unter slackware10 benutzen. dabei stelle ich folgendes fest: wenn die konsole von konqueror aus gestartet wird, klappt es. wenn sie aber direkt gestartet wird, durch auruf von "konsole", dann taucht bei "ps aux" nicht "/bin/bash" auf sondern "-bash" auf. ich müsste in diesem fall den vergleich also entsprechend anpassen.
nun frage ich mich und euch,
1. was eine elegantere lösung wäre (eine die in beiden fällen klappt), wie das skript ermittlen kann, ob es gesourct wird. ok, ich könnte statt einem strengen vergleich ja alles zulassen, was "bash" beinhaltet, aber vielleicht gehts eben auch eleganter.
2. was hat das "-bash" zu bedeuten.
wie weiss ein skript, ob es gesourct wird
Das hier müsste gehn:
Code: Select all
if [ "$0" = "/bin/bash" -o "$0" = "-bash" ]; then
[...]
fi
Hi Lateralus,
erstmal danke für die schnelle antwort!
ja, so würde es gehen, aber mir wäre halt eine allgemeine lösung lieber. was ist, wenn ich irgendwann noch auf einen weiteren fall stosse, der mit dieser konstruktion auch nicht abgefangen wird? ich würde eben überhaupt gerne wissen, wieso es diese verschiedenen formen von bash gibt, und was dieses "-bash" soll und ob man den weg über $0 irgendwie umgehen kann.
gruss, kanonenfutter
erstmal danke für die schnelle antwort!
ja, so würde es gehen, aber mir wäre halt eine allgemeine lösung lieber. was ist, wenn ich irgendwann noch auf einen weiteren fall stosse, der mit dieser konstruktion auch nicht abgefangen wird? ich würde eben überhaupt gerne wissen, wieso es diese verschiedenen formen von bash gibt, und was dieses "-bash" soll und ob man den weg über $0 irgendwie umgehen kann.
gruss, kanonenfutter
Hi!
Die allgemeine Lösung ist, in dem aufrufenden Skript eine Variable zu setzen, de bei direktem Aufruf nicht gesetzt wird. Durch Abfrage der Variablen läßt sich das unterscheiden.
Du könntest z.B. in die Variable die Prozess-ID der Aufrufers schreiben. Wenn die PID im aufgerufenen Skript die gleiche ist, dann wurde das Skript gesourct, denn dann läuft alles im gleichen Prozess ab.
Gruß,
hjb
Die allgemeine Lösung ist, in dem aufrufenden Skript eine Variable zu setzen, de bei direktem Aufruf nicht gesetzt wird. Durch Abfrage der Variablen läßt sich das unterscheiden.
Du könntest z.B. in die Variable die Prozess-ID der Aufrufers schreiben. Wenn die PID im aufgerufenen Skript die gleiche ist, dann wurde das Skript gesourct, denn dann läuft alles im gleichen Prozess ab.
Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?
Hallo hjb,
das mit der PID ist schonmal ne gute idee. allerdings wird das skript nicht von einem anderen skript aufgerufen sondern von hand, und da kann/will ich keine PID angeben.
beim ersten aufruf (gesourced) werden einige environmentvariablen gesetzt. bei weiteren aufrufen (nicht gesourced) werden diese dann benutzt.
ich hab jetzt spasseshalber mal eine etwas umständliche variante gewählt:
genausogut könnte man (ähnlich wie in der Lösung von Lateralus) die variable $0 prüfen, ob sie "bash" enthält. aber da wusste ich nicht, wie man (mit parametersubstitution o.ä. auf ganze wörter prüfen kann (grep -w)). daher der blöde umweg über ps (performance ist hier aber egal).
die lösung hat mehrere nachteile: sie geht enthält "bash" hartcodiert und hat diesen umweg über ps und grep, obwohl man ja den namen bereits in $0 hat. wenn also jemand noch ne bessere lösung weiss, wäre ich sehr interessiert.
das mit der PID ist schonmal ne gute idee. allerdings wird das skript nicht von einem anderen skript aufgerufen sondern von hand, und da kann/will ich keine PID angeben.
beim ersten aufruf (gesourced) werden einige environmentvariablen gesetzt. bei weiteren aufrufen (nicht gesourced) werden diese dann benutzt.
ich hab jetzt spasseshalber mal eine etwas umständliche variante gewählt:
Code: Select all
ps --no-headers --pid $$ | grep -wq "bash" && sourced="true" || sourced="false"
die lösung hat mehrere nachteile: sie geht enthält "bash" hartcodiert und hat diesen umweg über ps und grep, obwohl man ja den namen bereits in $0 hat. wenn also jemand noch ne bessere lösung weiss, wäre ich sehr interessiert.
ähm, das war tatsächlich absurd umständlich. einfacher wäre:
Code: Select all
echo $0 | grep -wq "bash" && sourced="true" || sourced="false"
Code: Select all
echo $(basename $0) | grep -wq "bash" && sourced="true" || sourced="false"