• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Shell-Funktion in Script verwenden

Luke23ae

Granny Smith
Registriert
27.06.09
Beiträge
13
Hallo

Ich habe in ~/.profile eine Funktion "tab" erstellt, die mir einen neuen Tab im Terminal öffnet. Diese möchte ich in meinem Bashscript "test.sh" benutzen. Wenn ich jedoch in script "tab" schreibe sagt er nur "tab: command not found". Woran liegt das und kann man da was tun?

Mfg
Lukas
 

mceuskadi

Grahams Jubiläumsapfel
Registriert
28.06.08
Beiträge
104
ist .profile nicht die Profil Datei von Mac Ports?
 

manromen

Riesenboiken
Registriert
28.01.08
Beiträge
289
Kannst Du die Funktion mal posten?
Kann mir jetzt so noch nichts darunter vorstellen.

[Edit]
Wenn die Funktion ganz normal im Terminal geht, kannst Du mal probieren:
Code:
 sh meine_funktion

[Edit2]
ist .profile nicht die Profil Datei von Mac Ports?
Nein das ist die konfigurations Datei von der Shell.
(sowas wie .bashrc von bash)
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
~/.profile oder ~/.bash_profile werden nur für interaktive Login-Shells ausgeführt.
Sprich: Die erste und oberste bash-Instanz, die du im Terminalfenster siehst.
Von dort aus gestartete Skripte sind nicht interaktiv, und dort gestartete weitere bash-Ebenen sind auch keine Login-Shells (by default).

Bau einfach folgende Zeilen zu Beginn deines Skripts ein:
Code:
if    [ -f ~/.bash_profile ] && [ -r ~/.bash_profile ]
then  source ~/.bash_profile
elif  [ -f ~/.bash_login ] && [ -r ~/.bash_login ]
then  source ~/.bash_login
elif  [ -f ~/.profile ] && [ -r ~/.profile ]
then  source ~/.profile
fi
Damit simuliert dein Skript (weitestgehend) ein interaktives Startverhalten. Im Allgemeinen ist das aber NICHT wünschenswert.

Wenn du in der ~/.profile o.ä. definierte Variablen oder Funktionen in deinen Skripten ebenfalls nutzen möchtest, musst du sie ihnen ganz einfach vererben. Andere Formulierung: Du musst sie zum Teil des Environment, zu einer Umgebungsvariablen der von dort gestarteten Programme machen.
Das sähe (sahnig) zB so aus:
Code:
blabla ()
{
  [I]hurz -dies -und das;[/I]
};  
export -f blabla;


MY_VALUE="12345";
export MY_VALUE;

[COLOR="DarkRed"]# oder (noch ne Möglichkeit, gleiche Wirkung):[/COLOR]

blabla ()
{
  [I]hurz -dies -und das;[/I]
}
declare -fx blabla;

MY_VALUE="12345";
declare -x MY_VALUE;

[COLOR="DarkRed"]# Oder aber (das nur bei Variablen oder Arrays)
# auch in verkürzter Form:[/COLOR]

export MY_VALUE="12345";
Durch diesen Export der Variablen und Funktionen werden sie auch in jeder von dort aus gestarteten Shell-Instanz vorhanden sein, egal ob interaktive Shell oder Skript.
(Es sei denn, man unterdrückt das absichtlich.)