• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> 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.)