wie weiss ein skript, ob es gesourct wird

Post Reply
Message
Author
kanonenfutter

wie weiss ein skript, ob es gesourct wird

#1 Post by kanonenfutter »

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.

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#2 Post by Lateralus »

Das hier müsste gehn:

Code: Select all

if [ "$0" = "/bin/bash" -o "$0" = "-bash" ]; then
[...]
fi

kanonenfutter

#3 Post by kanonenfutter »

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

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

#4 Post by hjb »

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
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

kanonenfutter

#5 Post by kanonenfutter »

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:

Code: Select all

ps --no-headers --pid $$ | grep -wq "bash" && sourced="true" || sourced="false"
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.

kanonenfutter

#6 Post by kanonenfutter »

ähm, das war tatsächlich absurd umständlich. einfacher wäre:

Code: Select all

echo $0 | grep -wq "bash" && sourced="true" || sourced="false"

kanonenfutter

#7 Post by kanonenfutter »

Code: Select all

echo $(basename $0) | grep -wq "bash" && sourced="true" || sourced="false"

Post Reply