2017-05-17 5 views
2

Ich benutze einen Unterprogrammaufruf zu GET_ENVIRONMENT_VARIABLE, um den Hostnamen des Computers in einem Fortran-Programm zu lesen. Ich kann diese Variable nicht lesen, obwohl es in Ordnung ist, wenn ich andere Variablen wie $USER lese. In meinem System (Debian Jessie, gfortran 4.9):Unerwartetes Verhalten von get_environment_variable mit gfortran

$ echo $HOSTNAME 
deckard 
$ echo $USER 
curro 

Ich habe dieses kurzes Programm vorbereitet:

program hello 
!           
implicit none 
integer :: ivar = 0, len, stat 
character(LEN=256) :: host, user 
call GET_ENVIRONMENT_VARIABLE('HOSTNAME', host, len, stat) 
if (stat == 0) then 
    print*, "Hostname read: ", host 
else 
    print*, "Hostname read failed: stat = ", stat 
endif 
call GET_ENVIRONMENT_VARIABLE('USER', user, len, stat) 
if (stat == 0) print*, "Username read: ", user 
print *, "This is user ", trim(user), " in node ", trim(host), "." 
! 
end program hello 

Wenn ich dieses einfache Programm ausführen (kompilierte mit oder ohne -std = F2003) die Ausgang:

$ ./a.out 
Hostname read failed: stat =   1 
Username read: curro                                                               
This is user curro in node . 

Daher ist der Fehler stat = 1. ich weiß, dass gfortran hat die intrinsische HOSTNM aber Für Kompatibilität mit anderen Compilern würde ich GET_ENVIRONMENT_VARIABLE bevorzugen. Irgendeine Idee warum passiert das?

+3

Überprüfen Sie den Status und sehen Sie, was die Fehlermeldung bedeutet. – albert

+2

Werte von 'stat' 1, -1 und 2 (sowie natürlich 0) haben wohldefinierte Bedeutungen. Sie sollten sich den Wert sicherlich anschauen. – francescalus

+3

Oder entfernen Sie stat und lesen Sie die Fehlermeldung. –

Antwort

3

Ich nehme an, dass Ihre Shell bash ist, aber das Endergebnis sollte nicht zu viel ändern, wenn die tatsächliche Shell eine andere ist.

In Bash haben Sie Zugriff auf environment variables und auf reguläre Bash-Variablen. Um eine Variable für untergeordnete Prozesse zugänglich zu machen (dh Programme, die von bash gestartet werden, wie zB gfortran oder Ihr Programm 'a.out'), muss es Teil der Umgebung sein. Standardmäßig werden nur Variablen aus der posix set of environment variables übergeben (obwohl einige weggelassen werden können).

Beispiele für Posix-Variablen, die sowohl von der bash-Befehlszeile und von Ihrem Fortran-Programm zugänglich sind (oder jedes anderes Programm für diese Angelegenheit): HOME, USER, PWD oder PATH.

Sie können überprüfen, ob sie tatsächlich zugänglich sind, indem geprüft, was das env Programm kennt:

env | grep HOME 
env | grep USER 

während

env | grep HOSTNAME 

kehrt nichts.

Sie müssen also die Variable HOSTNAME exportieren, um sie in die Liste der bekannten Umgebungsvariablen einzufügen. Bash weiß etwas über den Hostnamen, weil er eine Reihe von Variablen für die Bequemlichkeit des Benutzers definiert (siehe https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-HOSTNAME). Ein anderes Beispiel für Convenience-Variablen ist BASH_VERSION, das spezifisch für bash selbst ist.

export HOSTNAME 
env | grep HOSTNAME 

aber die Benutzer des Programms (oder sich selbst, sondern auf einem anderen Computer) möglicherweise keinen Zugriff auf sie als Umgebungsvariable haben so dass diese Lösung nicht für Sie von Nutzen sein könnten. Die "kanonische" Art, den Hostnamen zu kennen, ohne auf die Umgebungsvariable unter Linux angewiesen zu sein, besteht darin, das Programm "Hostname" auszuführen.

+0

Danke, sehr schöne Erklärung. Ich dachte, HOSTNAME sei genauso gültig wie die Umgebungsvariable USER oder HOME, aber sie sind unterschiedlich. In der Tat, wenn ich $ export HOSTNAME ausführen; ./a.out Ich habe das erwartete Ergebnis. – Currix

1

Haben Sie die Variable HOSTNAME exportiert?

Exportieren bedeutet, dass es auch für die untergeordneten Prozesse verfügbar ist. Das könnte sehr wohl der Unterschied zwischen den HOSTNAME und USER Umgebungsvariablen sein, die Sie erleben.