Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Feststellen, ob Datei gesourced wird

4 views
Skip to first unread message

Michael Schmarck

unread,
Sep 30, 2008, 7:00:28 AM9/30/08
to
Hi.

Ich habe eine "Bibliotheksdatei" in der ich einige Shell Funktionen
(für Bash) sammele. Um diese in Scripts zu nutzen, source ich
das dann:

. lib/functions.sh

Nun würde ich gerne einen "hilfreichen" Hinweis ausgeben, falls
die Datei dochmal direkt ausgeführt wird. Wenn also gemacht wird:

lib/functions.sh

Dazu dachte ich, das ich in die Datei einfach ein paar echos setze.
Aber diese echos werden natürlich auch ausgeführt, wenn die
Datei "gesourced" (gibt's dafür eigentlich auch einen deutschen
Ausdruck?) wird.

Das soll nicht sein.

Wie lässt sich in einem Script feststellen, ob das Script gesourced
wurde oder normal ausgeführt wurde? Reicht's dafür (bei bash)
SHLVL zu überprüfen? SHLVL wird ja um 1 erhöht, wenn das Script
mit "bash lib/functions.sh" ausgeführt wird. Aber zum einen scheint
das nur bei der bash so zu sein (und nicht bei ksh von Solaris 10),
und zum anderen müsste ich wissen, ob's erhöht wurde; ich müsste
also den alten Wert kennen.

Das ist's also nicht :)

Irgendwer 'ne Idee?

Wäre toll wenn's mit bash und ksh (von Solaris 10) klappen würde.

Danke sehr,

Michael

Sven Joachim

unread,
Sep 30, 2008, 7:11:50 AM9/30/08
to
Am 30.09.2008 um 13:00 schrieb Michael Schmarck:

> Ich habe eine "Bibliotheksdatei" in der ich einige Shell Funktionen
> (für Bash) sammele. Um diese in Scripts zu nutzen, source ich
> das dann:
>
> . lib/functions.sh
>
> Nun würde ich gerne einen "hilfreichen" Hinweis ausgeben, falls
> die Datei dochmal direkt ausgeführt wird. Wenn also gemacht wird:
>
> lib/functions.sh

Falls du das nicht willst, wäre es doch am einfachsten, der Datei die
Ausführungsrechte zu entziehen. Oder?

Sven

Heike C. Zimmerer

unread,
Sep 30, 2008, 7:16:04 AM9/30/08
to
Michael Schmarck <usenet-...@schmarck.cn> writes:

> Ich habe eine "Bibliotheksdatei" in der ich einige Shell Funktionen
> (für Bash) sammele. Um diese in Scripts zu nutzen, source ich
> das dann:
>
> . lib/functions.sh
>
> Nun würde ich gerne einen "hilfreichen" Hinweis ausgeben, falls
> die Datei dochmal direkt ausgeführt wird. Wenn also gemacht wird:
>
> lib/functions.sh

if [ "${0##*/}" = functions.sh ]; then
echo "Du sollst das gefälligst nicht direkt ausführen"
fi

Markus Wichmann

unread,
Sep 30, 2008, 7:23:25 AM9/30/08
to
Mach es doch so, wie jede mir bekannte C-Header-Datei: Erfrage die
Existenz einer Variablen. Wenn Sie existiert, wurde die Datei schon mal
gelesen. Also so hier:

if [[ -n "$LIB_FUNCTIONS_SH__" ]]
then
LIB_FUNCTIONS_SH__="already sourced"
#Definitionen
else
echo You already sourced this file! >&2
fi

HTH,
Markus
--
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.
-- gUnter nanonüm in de.alt.anime

Klaus Zerwes

unread,
Sep 30, 2008, 7:37:05 AM9/30/08
to

$0 enthällt den Scriptnamen.
basename $0 könnte man prüfen
hilft aber auch nicht mehr wenn die Datei umbenannt wurde oder verlinkt
und über den Link aufgerufen wird ...

Vielleicht im sourcenden Skript eine Variable setzen und im
functione-Sktript abfragen?


aber wenn das Skript eh nur Fuktionen enthällt, bewirkt ja ein
getrennter Aufruf eigentlich gar nichts ... ergo: que passa?
Klaus


> Wäre toll wenn's mit bash und ksh (von Solaris 10) klappen würde.
>
> Danke sehr,
>
> Michael


--
Klaus Zerwes
http://zero-sys.net

Michael Schmarck

unread,
Sep 30, 2008, 7:55:17 AM9/30/08
to
Klaus Zerwes <kze...@web.de> wrote:

> $0 enthällt den Scriptnamen.
> basename $0 könnte man prüfen

Klar. Bei ". lib/functions.sh" ist das dann:

--($ /.backup)-- . S
bash

--($ /.backup)-- bash S
S

Problem: Ich müsste wissen, wie die Datei heisst, in der sich der Code
befindet. Wie finde ich das heraus? Ich möchte das keinesfalls fest
codieren.

> hilft aber auch nicht mehr wenn die Datei umbenannt wurde oder verlinkt
> und über den Link aufgerufen wird ...

Ja, eben :)

Michael

Michael Schmarck

unread,
Sep 30, 2008, 7:57:58 AM9/30/08
to

Weitere Einschränkung: In der Datei möchte ich nicht den Namen der
Datei "fest einbauen". Das sollte nämlich tunlichst auch dann noch
klappen, wenn ich die Datei woanders hinkopiert bzw. gelinkt habe.

Wäre ja auch sonst zu einfach *G*

Michael

Michael Schmarck

unread,
Sep 30, 2008, 7:58:36 AM9/30/08
to
Sven Joachim <sven...@gmx.de> wrote:

> Falls du das nicht willst, wäre es doch am einfachsten, der Datei die
> Ausführungsrechte zu entziehen. Oder?

Hilft nur nicht gegen

bash datei

:)

Michael

Achim Peters

unread,
Sep 30, 2008, 7:59:59 AM9/30/08
to
Markus Wichmann schrieb:

> Mach es doch so, wie jede mir bekannte C-Header-Datei: Erfrage die
> Existenz einer Variablen. Wenn Sie existiert, wurde die Datei schon mal
> gelesen.

Inwiefern hilft das, das Szenario des OPs zu erkennen, in dem das Skript
ausgeführt *anstatt* gesourced wird?

Bye
Achim

Klaus Zerwes

unread,
Sep 30, 2008, 8:41:55 AM9/30/08
to
Michael Schmarck wrote:
> Klaus Zerwes <kze...@web.de> wrote:
>
>> $0 enthällt den Scriptnamen.
>> basename $0 könnte man prüfen
>
> Klar. Bei ". lib/functions.sh" ist das dann:
>
> --($ /.backup)-- . S
> bash
>
> --($ /.backup)-- bash S
> S
>
> Problem: Ich müsste wissen, wie die Datei heisst, in der sich der Code
> befindet. Wie finde ich das heraus? Ich möchte das keinesfalls fest
> codieren.

So. Nun hast du mich anjefixt ;-)


man bash erzählt was von BASH_SOURCE.
Das sollte anscheinen tun, wie hier 2 miniscripte vermuten lassen.


>> hilft aber auch nicht mehr wenn die Datei umbenannt wurde oder verlinkt
>> und über den Link aufgerufen wird ...
>
> Ja, eben :)

OK - den ksh - Teil überlasse ich dir mal, ist nicht so mein Gebiet ...

> Michael

Klaus

Juergen P. Meier

unread,
Sep 30, 2008, 1:00:56 PM9/30/08
to
Michael Schmarck <usenet-...@schmarck.cn>:

> Hi.
>
> Ich habe eine "Bibliotheksdatei" in der ich einige Shell Funktionen
> (für Bash) sammele. Um diese in Scripts zu nutzen, source ich
> das dann:
>
> . lib/functions.sh
>
> Nun würde ich gerne einen "hilfreichen" Hinweis ausgeben, falls
> die Datei dochmal direkt ausgeführt wird. Wenn also gemacht wird:
>
> lib/functions.sh
>
> Irgendwer 'ne Idee?

Pack an den Anfang der Datei die Zeile:

#!/bin/echo DIESE DATEI NICHT DIREKT AUSFUEHREN

Und verpass ihr ein x-Bit.

Damit wird statt den Inhalt auszufuehren nur diese Meldung auf stdout
ausgegeben.

HTH,
Juergen
--
Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)

Christian Brabandt

unread,
Sep 30, 2008, 4:16:29 PM9/30/08
to

Interessantes Problem. Mit der Bash funktioniert:

v=`return 2> /dev/null`
if [ $? -ne 0 ]; then
echo "${0##*/} Script nicht direkt aufrufen!";
fi

regards,
Christian
--
hundred-and-one symptoms of being an internet addict:
5. You find yourself brainstorming for new subjects to search.

Sven Mascheck

unread,
Sep 30, 2008, 7:00:42 PM9/30/08
to
Juergen P. Meier wrote:

> #!/bin/echo DIESE DATEI NICHT DIREKT AUSFUEHREN

PS: Auf einigen Unix-Varianten wird nur das erste
Argument verwendet. "best abuse of rules" wär'
dann der Einsatz von nobreak-spaces (0x0a)...

Juergen P. Meier

unread,
Oct 1, 2008, 12:47:12 AM10/1/08
to
<masc...@email.invalid>:

oder:

#!/dev/null/_DIESE_DATEI_NICHT_DIREKT_AUSFUEHREN_

Dann gibt es zumindest diesen Text als Teil der Fehlermeldung.

Michael Schmarck

unread,
Oct 1, 2008, 3:02:17 AM10/1/08
to
Juergen P. Meier <nospa...@jors.net> wrote:

> Michael Schmarck <usenet-...@schmarck.cn>:
>> Hi.
>>
>> Ich habe eine "Bibliotheksdatei" in der ich einige Shell Funktionen
>> (für Bash) sammele. Um diese in Scripts zu nutzen, source ich
>> das dann:
>>
>> . lib/functions.sh
>>
>> Nun würde ich gerne einen "hilfreichen" Hinweis ausgeben, falls
>> die Datei dochmal direkt ausgeführt wird. Wenn also gemacht wird:
>>
>> lib/functions.sh
>>
>> Irgendwer 'ne Idee?
>
> Pack an den Anfang der Datei die Zeile:
>
> #!/bin/echo DIESE DATEI NICHT DIREKT AUSFUEHREN
>

Das ist die schönste Lösung, denke ich. Gute Idee!

> Und verpass ihr ein x-Bit.

Nee :) Aber wenn doch, dann wäre das die Lösung.

Danke sehr!
Michael

0 new messages