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

make importiert nicht shell-Umgebungsvariablen

51 views
Skip to first unread message

Andre Massing

unread,
Jan 19, 2006, 9:10:07 PM1/19/06
to
Hi,

beim Erstellen und Testen diverser Makefiles auf meinem System (testing/unstable) ist mir
aufgefallen, dass die Umgebungsvariablen der Shell (Bash 3.1) nicht importiert werden, was
ja normalerweise der Fall sein sollte, oder? Das Test-Makefile (make-Version 3.81)

os:
echo $(OSTYPE)

liefert dann

andre@orca:newton 192>make --warn-undefined-variables
makefile:2: Warnung: undefinierte Variable »OSTYPE«
echo

und somit nur eine schicke Leerzeile, obwohle die Variable laut "set" definiert ist.
andre@orca:newton 193> set |grep OSTYPE
46:OSTYPE=linux-gnu

Insgesamt ist mir folgendens aufgefallen:
Wenn ich Variablen in meiner .bashrc eintrage, so sind sie dann auch im Makefile verfügbar
(das enprach ca. der Ausgabe von "printenv")
Variablen, die "set" anzeigt (wie z. B. OSTYPE), nicht aber "printenv", stehen nicht zur
Verfügung. Deswegen also meine Fragen:

1) Welche Variablen genau spuckt printenv aus?
2) Welche Variablen im teilweisen Gegensatz dazu spuckt "set" aus?
3) Wo genau werden denn bloß die ganzen (Standard)-Variablen gesetzt, die mir "set"
ausgibt, ein grep -R in /etc liefert mir weder OSTYPE, HOSTNAME, HOSTTYPE usw., weder
in /etc/profile, /etc/skel noch sonst wo.
3)Welche Umgebungsvariablen liest make denn nun genau aus?

Irgendwas in dem ganzen Variablen-Definier-und-Gebrauch-Durcheinander habe ich wohl falsch
verstanden, aber was?

Vielen Dank und viele Grüße,
Andre

--
Haeufig gestellte Fragen und Antworten (FAQ):
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-g...@lists.debian.org
mit dem Subject "unsubscribe". Probleme? Mail an listm...@lists.debian.org (engl)

Daniel Leidert

unread,
Jan 20, 2006, 12:30:19 AM1/20/06
to
Am Freitag, den 20.01.2006, 03:05 +0100 schrieb Andre Massing:

> beim Erstellen und Testen diverser Makefiles auf meinem System (testing/unstable) ist mir
> aufgefallen, dass die Umgebungsvariablen der Shell (Bash 3.1) nicht importiert werden, was
> ja normalerweise der Fall sein sollte, oder? Das Test-Makefile (make-Version 3.81)
>
> os:
> echo $(OSTYPE)

echo $$OSTYPE

ist wohl das, was du suchst.

MfG Daniel

Andre Massing

unread,
Jan 20, 2006, 5:00:20 AM1/20/06
to
Daniel Leidert schrieb:

>
>
> echo $$OSTYPE
>
> ist wohl das, was du suchst.

Ja, danke, das funktioniert, aber "leider" nur, weil nun die Shell, an der die Zeile
übergeben wird, die Variable expandiert (und nicht make direkt), und die Shell ja OSTYPE
kennt. Dennoch ist mir der Selektionsmechanismus, den Make bezüglich meiner
Shell-Variablen an den Tag legt, nicht klar ( im Zusammenhang mit den von printenv und set
gezeigten Variablen).

Viele Grüße,
Andre

Peter...@consol.de

unread,
Jan 20, 2006, 5:10:45 AM1/20/06
to
On Jan 20 2006 Andre Massing <mas...@gmx.de> wrote:

> Daniel Leidert schrieb:
>
>>
>>
>> echo $$OSTYPE
>>
>> ist wohl das, was du suchst.
>
> Ja, danke, das funktioniert, aber "leider" nur, weil nun die Shell, an der

> die Zeile übergeben wird, die Variable expandiert (und nicht make direkt),


> und die Shell ja OSTYPE kennt. Dennoch ist mir der Selektionsmechanismus,

> den Make bezüglich meiner Shell-Variablen an den Tag legt, nicht klar ( im


> Zusammenhang mit den von printenv und set gezeigten Variablen).
>

> [...]

Schau Dir mal die info-pages zu make an:

6.9 Variables from the Environment
==================================

Variables in `make' can come from the environment in which `make' is
run. Every environment variable that `make' sees when it starts up is
transformed into a `make' variable with the same name and value.
However, an explicit assignment in the makefile, or with a command
argument, overrides the environment. (If the `-e' flag is specified,
then values from the environment override assignments in the makefile.
*Note Summary of Options: Options Summary. But this is not recommended
practice.)
[...]

Wenn ich bei mir das teste:

~:1> cat makefile
all:
echo $(OSTYPE)
~:1> echo $OSTYPE
linux-gnu
~:1> make
echo

~:1> export OSTYPE
~:1> make
echo linux-gnu
linux-gnu
~:1> export OSTYPE=foo
~:1> make
echo foo
foo

$OSTYPE wird von der Shell (bei mir bash) standardmäßig nicht exportiert.
OSTYPE steht in bash(1) in der Liste der Shell Variables, da ist aber keine
Aussage zu finden ob die exportiert sind oder nicht.

~:1> printenv | grep OSTYPE
~:1> export OSTYPE
~:1> printenv | grep OSTYPE
OSTYPE=linux-gnu

Hth -- Peter

--
Peter...@consol.de ConSol* Software GmbH
Phone +49 89 45841-100 Consulting & Solutions
Mobile +49 177 6040121 Franziskanerstr. 38
http://www.consol.de D-81669 München

Andre Massing

unread,
Jan 20, 2006, 9:00:23 AM1/20/06
to
Peter...@ConSol.de schrieb:

>
> Schau Dir mal die info-pages zu make an:
>
> 6.9 Variables from the Environment
> ==================================
>
> Variables in `make' can come from the environment in which `make' is
> run. Every environment variable that `make' sees when it starts up is
> transformed into a `make' variable with the same name and value.
> However, an explicit assignment in the makefile, or with a command
> argument, overrides the environment. (If the `-e' flag is specified,
> then values from the environment override assignments in the makefile.
> *Note Summary of Options: Options Summary. But this is not recommended
> practice.)

Danke für den Verweis!

>
> $OSTYPE wird von der Shell (bei mir bash) standardmäßig nicht exportiert.
> OSTYPE steht in bash(1) in der Liste der Shell Variables, da ist aber keine
> Aussage zu finden ob die exportiert sind oder nicht.
>
> ~:1> printenv | grep OSTYPE
> ~:1> export OSTYPE
> ~:1> printenv | grep OSTYPE
> OSTYPE=linux-gnu
>
> Hth -- Peter
>

Okay, mal sehen, ob ich das nun "verstehe" :-) Also bei mir steht in jeder (Bash)-Shell
die Variable OSTYPE zur Verfügung. Beim Starten von make liest make aber anscheinend nur
die Variablen ein, die ich mir auch mittels printenv ausgeben kann. Exportiere ich OSTYPE
vorher, sieht es sowohl printenv als auch make. Was mich wieder zu der Frage bringt, wo
eigentlich die meisten der Umgebungsvariablen (OSTYPE, HOSTNAME,...) TATSÄCHLICH unter
Debian definiert werden. Ich habe mit "strace bash" mal versucht nachzuvollziehen, welche
evt. relevanten Dateien beim Start gelesen werden, leider habe ich da auch nur die
bekannten Config-Dateien erkannt, in denen eben nicht die meisten Variablen definiert werden.

[...]
open("/home/andre/.bashrc", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=2515, ...}) = 0
brk(0x81a1000) = 0x81a1000
read(3, "# ~/.bashrc: executed by bash(1)"..., 2515) = 2515
[...]

Ich befürchte, ich habe ein erhebliches "Shells und Ihre Variablen"-Verständnisproblem. :-)
Wenn jemand bereit wäre, mich aufzuklären, wäre ich sehr dankbar. Diverse info-Seiten,
Bashguides des tldp usw. haben mir keine befriedigen Antwort geliefert. Angeblich sollen
die systemweiten Variablen in /etc/profile, /etc/bashrc oder dergleichen gesetzt werden,
was aber (bei mir) nicht der Fall ist.

Viele Grüße
Andre

Peter...@consol.de

unread,
Jan 20, 2006, 9:10:41 AM1/20/06
to
On Jan 20 2006 Andre Massing <mas...@gmx.de> wrote:

> Peter...@ConSol.de schrieb:


> [...]
>
> Ich befürchte, ich habe ein erhebliches "Shells und Ihre
> Variablen"-Verständnisproblem. :-) Wenn jemand bereit wäre, mich
> aufzuklären, wäre ich sehr dankbar. Diverse info-Seiten, Bashguides
> des tldp usw. haben mir keine befriedigen Antwort geliefert. Angeblich
> sollen die systemweiten Variablen in /etc/profile, /etc/bashrc oder
> dergleichen gesetzt werden, was aber (bei mir) nicht der Fall ist.
>

> [...]

Ein erster Anlauf wäre dazu die Manpage der verwendeten Shell ;-)

aus bash(1):

ENVIRONMENT
When a program is invoked it is given an array of strings called the
environment. This is a list of name-value pairs, of the form
name=value.

The shell provides several ways to manipulate the environment. On
invocation, the shell scans its own environment and creates a parameter
for each name found, automatically marking it for export to child pro-
cesses. Executed commands inherit the environment. The export and
declare -x commands allow parameters and functions to be added to and
deleted from the environment. If the value of a parameter in the envi-
ronment is modified, the new value becomes part of the environment,
replacing the old. The environment inherited by any executed command
consists of the shell's initial environment, whose values may be modi-
fied in the shell, less any pairs removed by the unset command, plus
any additions via the export and declare -x commands.

[...]

export [-fn] [name[=word]] ...
export -p
The supplied names are marked for automatic export to the envi-
ronment of subsequently executed commands. If the -f option is
given, the names refer to functions. If no names are given, or
if the -p option is supplied, a list of all names that are
exported in this shell is printed. The -n option causes the
export property to be removed from each name. If a variable
name is followed by =word, the value of the variable is set to
word. export returns an exit status of 0 unless an invalid
option is encountered, one of the names is not a valid shell
variable name, or -f is supplied with a name that is not a func-
tion.

Kurz: Unix-Shells kennen in der Regel zwei Typen von Variablen: Die für
export markierten und die ohne. Nur erstere werden an weitere Subprozesse
vererbt.

Für die Variablen beim Start und die durchlaufenen rc-Files angeht ist der
Abschnitt "INVOCATION" zuständig.

Hth -- Peter

--
Peter...@consol.de ConSol* Software GmbH
Phone +49 89 45841-100 Consulting & Solutions
Mobile +49 177 6040121 Franziskanerstr. 38
http://www.consol.de D-81669 München

Andre Massing

unread,
Jan 20, 2006, 10:50:14 AM1/20/06
to
Peter...@ConSol.de schrieb:


> Ein erster Anlauf wäre dazu die Manpage der verwendeten Shell ;-)

Da war ich schon...hat mich leider auch nicht weiter gebracht, s.u.


>
> Kurz: Unix-Shells kennen in der Regel zwei Typen von Variablen: Die für
> export markierten und die ohne. Nur erstere werden an weitere Subprozesse
> vererbt.
>
> Für die Variablen beim Start und die durchlaufenen rc-Files angeht ist der
> Abschnitt "INVOCATION" zuständig.

Okay, hier liegt ja gerade mein Verständnis-Problem, also bash(1) sagt dazu:

When bash is invoked as an interactive login shell, or as a non-interactive shell with
the --login option, it first reads and executes commands from the file /etc/profile, if
that file exists. After reading that file, it looks for ~/.bash_profile,
~/.bash_login, and ~/.profile, in that order, and reads and executes commands from
the first one that exists and is readable
[...]

und

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.
[...]

Das Verwunderliche für mich ist nun, dass in all diesen besagten Dateien
die gesuchten Variablen OSTYPE, HOSTNAME, HOSTTYPE und wie sie alle heißen, eben NICHT
definiert sind. Ein grep -R <verfluchte Shell-Variable> ./ liefert mir nix.
Meine Config-Files sind praktisch nackt :-) zumindestens steht sehr wenig drin.
Die einzigen nichtkommentieren Zeilen in /etc/bash.bashrc sind:

shopt -s checkwinsize

# set variable identifying the chroot you work in (used in the prompt below) <--ich weiß,
ist doch nen Kommentar :-) )

if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Das war's. Ähnlich leer sieht es auch in den anderen Config-Files aus.
Wie sehen bei dir denn die entsprechenden Dateien aus? Findest du eine Datei, wo
OSTYPE=linux-gnu
o.ä. steht? Irgendwo müssen ja schließlich die Variablen herkommen...

Viele Grüße,
Andre

Peter...@consol.de

unread,
Jan 20, 2006, 11:30:12 AM1/20/06
to
On Jan 20 2006 Andre Massing <mas...@gmx.de> wrote:

> Peter...@ConSol.de schrieb:
>


> [...]
>
> Das Verwunderliche für mich ist nun, dass in all diesen besagten
> Dateien die gesuchten Variablen OSTYPE, HOSTNAME, HOSTTYPE und wie sie
> alle heißen, eben NICHT definiert sind. Ein grep -R <verfluchte
> Shell-Variable> ./ liefert mir nix.
>

> [...]

Das scheinen Bash-spezifische Variablen zu sein, die die Bash beim Start
selbst initialisiert. In der Manpage sind sie als "Automatically set"
gekennzeichnet. Ein Blick in die Datei /usr/include/bash/conftypes.h (Paket
bash-builtins) scheint das auf den ersten Blick zu bestätigen, da sie von
#defines abgeleitet werden, die vom System kommen.

D.h. bei einer anderen Shell kann das wieder ganz anders aussehen.

Peter

--
Peter...@consol.de ConSol* Software GmbH
Phone +49 89 45841-100 Consulting & Solutions
Mobile +49 177 6040121 Franziskanerstr. 38
http://www.consol.de D-81669 München

Andre Massing

unread,
Jan 21, 2006, 7:40:11 AM1/21/06
to
Peter...@ConSol.de schrieb:

>
> Das scheinen Bash-spezifische Variablen zu sein, die die Bash beim Start
> selbst initialisiert. In der Manpage sind sie als "Automatically set"
> gekennzeichnet. Ein Blick in die Datei /usr/include/bash/conftypes.h (Paket
> bash-builtins) scheint das auf den ersten Blick zu bestätigen, da sie von
> #defines abgeleitet werden, die vom System kommen.
>
> D.h. bei einer anderen Shell kann das wieder ganz anders aussehen.
>
> Peter
>

So, das werde ich jetzt erst mal im Detail nachvollziehen und ein Blick in das
bash-builtins-Paket werfen. "strings /bin/bash" hat mir auch die entsprechende
Variablenname ausgegeben, will für mich aber noch klären, wo/wie die Bash die selbst
initialisiert. Irgendwo muss ja schließlich die Verbindung zwischen Bash und
Rechner-spezifischen Daten sein.
Wenn ich bestimmte Variablen exportieren möchte, mach ich das wohl am besten in den schon
genannten Config-Datein. Ursprünglich wollte ich im Makefile ein OSTYPE-spezifischen
Setzen der LIBS-Pfade veranlassen. Das geht dann wohl nur direkt über die Subshell per
$$OSTYPE. Vielleicht erstelle lieber ein configure Skript...

Dann vielen Dank für die Hilfe und viele Grüße,
Andre

0 new messages