Forum: PC Hard- und Software Kubuntu: Variable setzen geht nicht?!


von Benny (Gast)


Lesenswert?

ich habe das folgende script:
#!/bin/bash -f
if [ "$FLIP_HOME" = "" ]; then
  echo "FLIP_HOME is not defined, please use setenv to set flip home"
  echo "e.g :"
  echo "setenv FLIP_HOME /home/flip.3.2.1/bin"
  exit 1
fi

Jetzt kommt immer die Meldung FLIP_HOME is not ....

da setenv nicht geht, habe ich
export FLIP_HOME=mydirectory
gemacht und
echo $FLIP_HOME gibt dann auch
mydirectory

Was is da los? (bin übrigens linux newbie)

von Georg A. (Gast)


Lesenswert?

setenv gibts bei der bash nicht, da heisst das halt export. Und die bash 
ist bei Ubuntu AFAIK die Standardshell. Oder wo liegt dein Problem?

von Benny (Gast)


Lesenswert?

Georg A. schrieb:
> setenv gibts bei der bash nicht, da heisst das halt export. Und die bash
> ist bei Ubuntu AFAIK die Standardshell. Oder wo liegt dein Problem?

genau deswegen habe ich ja auch export ..... gemacht.

Aber wie oben schon erwähnt kommt immer noch die Meldung
FLIP_HOME is not ...

obwohl
echo $FLIP_HOME
wie gewünscht funktioniert!

von Schorsch (Gast)


Lesenswert?

Funktioniert bei mir ohne Probleme.

Wie rufst du nachher dein Shellscript auf?
Hoffentlich schon in demselben Konsole-Fenster, in dem du auch den 
export eingetippt hast?

Was passiert wenn du direkt
1
FLIP_HOME=xxx ./flip.sh
eintippst? (Eine Zeile!)

von Daniel B. (dbuergin)


Lesenswert?

Versuchs mal mit:

if [ "$FLIP_HOME" == "" ]; then

Deine Version ist eine Zuweisung, nicht ein Vergleich.
Passiert einem Anfänger häufig bei einer IF-Abfrage ;-)

Daniel

von Klaus W. (mfgkw)


Lesenswert?

Daniel B. schrieb:
> Versuchs mal mit:
>
> if [ "$FLIP_HOME" == "" ]; then
>
> Deine Version ist eine Zuweisung, nicht ein Vergleich.
> Passiert einem Anfänger häufig bei einer IF-Abfrage ;-)
>
> Daniel

In der bash ist = be nem Test der Stringvergleich.
Siehe man test.

Aber macht nix, passiert einem Anfänger öfter :-)

von Klaus W. (mfgkw)


Lesenswert?

@ Benny:

Ich habe noch nicht ganz verstanden, was du vorhast.
Vermutung: du bist in einer Shell (Terminal oder was
auch immer), möchtest das obige Skript starten und hoffst
dann nach Beenden des Skripts, in deiner wieder aktuellen Shell
die Environment-Variable geändert zu haben?
Diese Hoffnung wäre vergebens, weil ein Prozeß nicht bei seinem
Vater oder anderen Vorfahren das Environment ändern kann, nur
für seine zukünftigen eigenen Kinder.

Falls meine Vermutung stimmt, musst du dein obiges Skript
aufrufen mit einem vorangestellten Punkt und Leerzeichen, also z.B.:
1
. ./meintollesskript

Dadurch läuft das Skript nicht in einer neuen Shell, sondern in
der aktuellen und kann dort die Variable ändern.
Dann kannst du in dein Skript eine Zeile einbauen in der Art:
1
#!/bin/bash -f
2
if [ "$FLIP_HOME" = "" ]; then
3
  echo "FLIP_HOME ist nicht gesetzt, ich setze es mal auf blabla"
4
  export FLIP_HOME="blabla"
5
fi

von Daniel B. (dbuergin)


Lesenswert?

hehe, kleines Eigentor. Habe mich so an die alte Notation gewöhnt.
Und von C und Perl her, habe ich eine Abneigung gegen solche If's

Bei mir läuft auf jeden Fall das Script, so wie es soll:
1
su23sr4:~: ps
2
   PID TTY         TIME CMD
3
 12136 pts/1       0:00 ps
4
  4007 pts/1       0:00 bash
5
6
su23sr4:~: ls -l xx.sh
7
-rwxr-xr-x   1 daenu  crappl       192 Dec 14 13:48 xx.sh
8
9
su23sr4:~: cat xx.sh
10
#!/bin/bash -f
11
if [ "$FLIP_HOME" == "" ]; then
12
  echo "FLIP_HOME is not defined, please use setenv to set flip home"
13
  echo "e.g :"
14
  echo "setenv FLIP_HOME /home/flip.3.2.1/bin"
15
  exit 1
16
fi
17
18
su23sr4:~: echo $FLIP_HOME
19
mydirectory
20
su23sr4:~: ./xx.sh
21
su23sr4:~: export FLIP_HOME=""
22
su23sr4:~: ./xx.sh
23
FLIP_HOME is not defined, please use setenv to set flip home
24
e.g :
25
setenv FLIP_HOME /home/flip.3.2.1/bin

@Benny: Setz mal die Befehl ab (natürlich mit deinen Scriptnamen), so
wie ich es oben gemacht habe, und cut-and-paste den output.

von Benny (Gast)


Lesenswert?

Daniel B. schrieb:
> Setz mal die Befehl ab (natürlich mit deinen Scriptnamen), so
> wie ich es oben gemacht habe, und cut-and-paste den output.

wie gesagt, linux ist noch nicht mein Spezialgebiet:

Ich hatte zuerst einfach
flip.sh
versucht, da hat der flip.sh nicht gefunden
dann im Internet ein Tip mit
sudo flip.sh
da hat er das Script zwar gestartet aber wie beschrieben die Variable 
nicht mehr gekannt

jetzt mit

./flip.sh
geht es

Klaus Wachtler schrieb:
> Ich habe noch nicht ganz verstanden, was du vorhast.
> Vermutung: du bist in einer Shell (Terminal oder was
> auch immer), möchtest das obige Skript starten und hoffst
> dann nach Beenden des Skripts, in deiner wieder aktuellen Shell
> die Environment-Variable geändert zu haben?
nein, anders:
ich möchte in der shell (bash) die Variable setzen und im Script, dass 
ich dann aufrufe, soll sie bekannt sein

> Diese Hoffnung wäre vergebens, weil ein Prozeß nicht bei seinem
> Vater oder anderen Vorfahren das Environment ändern kann, nur
> für seine zukünftigen eigenen Kinder.
>
> Falls meine Vermutung stimmt, musst du dein obiges Skript
> aufrufen mit einem vorangestellten Punkt und Leerzeichen, also z.B.:. 
./meintollesskript
ja, wie schon gesagt, damit geht es (aber warum)

Danke an alle und die Frage nach einer umfassenden Einführung zu Linux 
im Internet (nicht irgendwelche Befehlserklärungen sondern mehr das 
Grundlegende) damit ich auch ohne eure Hilfe weiterkomme ...
(bitte kein Hinweis auf google)

von Klaus W. (mfgkw)


Lesenswert?

Aufgerufene Kommandos werden unter Linux folgendermaßen gesucht
(vereinfacht):
1. Falls es ein internes Kommando der Shell ist, dann wird es
   als solches ausgeführt (test, export, ...)
2. Dann wird die Liste der alias-Definitionen abgeklappert, ob es
   dabei ist.
(Kann auch sein, daß 1. und 2. vertauscht werden, müsste ich nachsehen.)
3. Es werden alle Pfade in der Variablen PATH hergenommen und
   nachgesehen,. ob es dort eine ausführbare Datei mit dem
   Kommandonamen gibt. Falls ja, dann wird diese Datei ausgeführt
   (wie gesagt für ein Shellskript in einer eigenen Shell).

Üblicherweise ist . nicht in PATH, deshalb wird ein Kommando
nicht gesucht im aktuellen Verzeichnis.

von Daniel B. (dbuergin)


Lesenswert?

Ok, jetzt ist alles klar, deine Shell findet dein Script nicht, da in
deiner PATH Variable der Eintrag fehlt, in deinem aktuellen Pfad
nach zu schauen.

Bei mir sieht die in etwa so aus:

su23sr4:~: echo $PATH
/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/site/bin:/usr/sfw/bin:/usr/ 
local/rrdtool/bin:/opt/gcc/bin

Wenn ich jetzt mein Script ohne ./ am Anfang aufrufe, passiert 
folgendes:

su23sr4:~: xx.sh
-bash: xx.sh: command not found

Mit "type" findest Du raus, was die Shell starten würde, wenn Du etwas
eingibst:

su23sr4:~: type xx.sh
-bash: type: xx.sh: not found

Wenn Du nun folgendes machst:

su23sr4:~: export PATH=$PATH:.
su23sr4:~: echo $PATH
/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/site/bin:/usr/sfw/bin:/usr/ 
local/rrdtool/bin:/opt/gcc/bin:.

man beachte den :. am Schluss.

Dann weisst Du die Shell an, auch im aktuellen Pfad zu suchen, und nun 
findet sie dein Script auch:

su23sr4:~: type xx.sh
xx.sh is ./xx.sh

Ob nun der aktuelle Pfad in der PATH Variable sein soll, darüber wird
seit jeher in der UNIX-Welt gestritten. Sicher ist, dass das beim
Superuser "root" das auf keinen Fall sein sollte, da man ihm sonst
irgend welche Scripts unterjubeln kann.

Mit "sudo" hast Du deine Identität auf den User "root" gewechselt.
Damit wurde auch eine völlig neue Shell gestartet, OHNE das die
aktuellen Variablen mitgenommen wurden.

Also entweder erweiterst Du deine PATH Variable zum Beispiel im
.bashrc in deinem HOME-Directory mit einem ":." oder Du startest deine
Scripts immer mit dem absoluten oder relativen Pfad vorne dran.

von Benny (Gast)


Lesenswert?

Daniel B. schrieb:
> Also entweder erweiterst Du deine PATH Variable zum Beispiel im
> .bashrc in deinem HOME-Directory mit einem ":." oder Du startest deine
> Scripts immer mit dem absoluten oder relativen Pfad vorne dran.

den Teil von Linux hab ich dank deiner guten Erklärung jetzt verstanden,
ich suche aber noch nach einer guten Einführung in die Grundlagen von 
Linux im Internet in der z.B. auch steht was es mit .bashrc etc. auf 
sich hat

weiß da jemand was empfehlenswertes?

von Georg A. (Gast)


Lesenswert?

Wenn du Englisch kannst, lies die manpage zur bash (evtl. gibts die auch 
auf Deutsch...). Ist zwar umfangreich, aber wichtig ist eigentlich, dass 
man mal "gelesen" hat, was die alles kann. Im Bedarfsfall kann man ja 
dann nochmal genau nachschauen. Suchen kann man mit /begriff (und n für 
die weiteren Corkommen) auch, damit bekommt man auch zB. zum Thema 
bashrc alles gesagt.

Ausschnitt: " When  an  interactive  shell  that  is  not  a  login 
shell  is started, bash reads and executes commands from 
/etc/bash.bashrc and
~/.bashrc, if these files exist."

von Daniel B. (dbuergin)


Lesenswert?

Ein wirlich guter Link weiss ich auch gerade nicht. Ev: 
http://stefaanlippens.net/bashrc_and_others

Ist auch ein bisschen schwierig, da sich in diesem Bereich die einzelnen 
Unix-Derivate unterscheiden.

Im Normalfall werden bei einem Login die folgenden Files ausgeführt:
- /etc/profile
- $HOME/.profile
- /etc/bash/bashrc oder ähnlich (wenn vorhanden)
- /etc/bash_bashrc (wenn vorhanden)
- $HOME/.bashrc (wenn vorhanden)
- $HOME/.bash_profile (wenn vorhanden)
- $HOME/.bash_login (wenn vorhanden)

Um rauszufinden, wie es auf einem neuen System funktioniert, mache ich 
meistens folgendes. Ich suche alle Files im /etc Verzeichnis, die 
"profile" oder "bash" im Namen haben und das gleiche in meinem 
Homeverzeichnis.
In jedes dieser Files trage ich eine Zeile wie diese ein:

echo "Ich bin das .profile"

Natürlich entsprechend dem aktuellen File, so dass ich sie unterscheiden 
kann. Wenn ich mich dann einlogge, oder ein neues Terminalfenster 
öffene, sehe ich, welche Files durchlaufen werden. Bei mir passiert 
folgendes:

Ich bin das /etc/profile
Ich bin das HOME/.profile
Ich bin das HOME/.bashrc

Also einfach mal ausprobieren, kaputt gehen kann nichts ;-)

Daniel

von Troll (Gast)


Lesenswert?

Eine große Übersicht über viele Funktionen und Tipps zur Bash findest du 
auf Wikibooks:
http://de.wikibooks.org/w/index.php?title=Spezial%3ASuche&search=bash

Und wichtig: Benutze sudo wirklich nur, wenn du es wirklich brauchst! 
sudo führt den Befehl/das Script/usw. als root aus und kann somit das 
System zerstören. In fast allen Fällen ist das aber nicht nötig.

Eigene Scripte startest du entweder mit dem absoluten Pfad (ausgehend 
vom Root-Verzeichnis / ):
 /home/benutzer/scripte/abc.sh
oder wenn du schon im Verzeichnis bist mit:
 ./abc.sh
(Nur Beispielnamen)
./abc.sh bedeutet: such im aktuellen Verzeichnis (dafür steht der .) 
nach dem Script abc.sh und starte es.

Füge außerdem nicht wie oben vorgeschlagen . zum PATH hinzu. Es hat gute 
Gründe warum das da nicht schon von alleine drin steht.

von Tux (Gast)


Lesenswert?

Georg A. schrieb:
> setenv gibts bei der bash nicht, da heisst das halt export. Und die bash
> ist bei Ubuntu AFAIK die Standardshell. Oder wo liegt dein Problem?

Ne, Standard ist schon seit mehreren Versionen "dash"

von Georg A. (Gast)


Lesenswert?

> Ne, Standard ist schon seit mehreren Versionen "dash"

Ja, stimmt. Das Sch...-Teil habe ich verdrängt. Die kann leider mit 
einigen Bash-Konstrukten nichts anfangen, was insb. wegen dem Link 
/bin/sh nach /bin/dash diverse Standard-Shellskripte erstmal mit völlig 
unverständlichen Fehlermeldungen terminiert.

Und das alles nur, weil die Jungs 700K sparen wollen. Auf einem 
Desktop/Server. Zu Zeiten, wo einem die TB-Platten um die Ohren gehauen 
werden. Und wo allein schon "vim-tiny" über 600KB hat. Völlig hirnrissig 
das ganze...

von Rolf M. (rmagnus)


Lesenswert?

Georg A. schrieb:
>> Ne, Standard ist schon seit mehreren Versionen "dash"
>
> Ja, stimmt. Das Sch...-Teil habe ich verdrängt. Die kann leider mit
> einigen Bash-Konstrukten nichts anfangen, was insb. wegen dem Link
> /bin/sh nach /bin/dash diverse Standard-Shellskripte erstmal mit völlig
> unverständlichen Fehlermeldungen terminiert.

Wenn das Skript am Anfang ein "#!/bin/sh" angibt, dann darf es eben 
nicht davon ausgehen, daß es von einer bash ausgeführt wird muß und sich 
auf die in POSIX definierten Shell-Features beschränken. Wenn es 
bash-spezifische Konstrukte enthält, dann doch bitte explizit 
"#!/bin/bash" angeben. Es ist nicht die Schuld der dash, wenn in 
Skripten der falsche Interpreter angegeben ist.

> Und das alles nur, weil die Jungs 700K sparen wollen. Auf einem
> Desktop/Server. Zu Zeiten, wo einem die TB-Platten um die Ohren gehauen
> werden. Und wo allein schon "vim-tiny" über 600KB hat. Völlig hirnrissig
> das ganze...

Es geht nicht um das Sparen von 700k, sondern darum, daß die bash extrem 
mächtig, aber auch sehr träge ist. Die dash ist dafür ausgelegt, nicht 
viel mehr als das zu implementieren, was von POSIX verlangt wird und 
dadurch  schlank und schnell zu sein. Die dash ist beim Ausführen von 
Skripten deutlich schneller als die bash. Da nach den Debian-Regeln die 
ganzen Systemskripte eh nur POSIX verwenden sollen, müssen sie 
eigentlich auch mit der dash gehen, sonst ist das ein Fehler im Skript.
Übrigens steht das 'd' für debian. Die dash ist also nicht etwa auf dem 
Mist von Ubuntu gewachsen, sondern eine debian-Erfindung. Nur hat sich 
Ubuntu halt als erster getraut, sie auch konsequent einzusetzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.