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
> 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
> 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
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
$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
> $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
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
> 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
Inwiefern hilft das, das Szenario des OPs zu erkennen, in dem das Skript
ausgeführt *anstatt* gesourced wird?
Bye
Achim
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
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)
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.
> #!/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)...
oder:
#!/dev/null/_DIESE_DATEI_NICHT_DIREKT_AUSFUEHREN_
Dann gibt es zumindest diesen Text als Teil der Fehlermeldung.
> 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