get_environment_variable 与 gfortran 的意外行为

Unexpected behavior of get_environment_variable with gfortran

我正在使用对 GET_ENVIRONMENT_VARIABLE 的子例程调用来读取 Fortran 程序中的计算机主机名。我无法读取此变量,但如果我读取其他变量也没关系,如 $USER。在我的系统中(Debian Jessie,gfortran 4.9):

$ echo $HOSTNAME 
deckard
$ echo $USER
curro

我准备了这个小程序:

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

如果我 运行 这个简单的程序(使用或不使用 -std=f2003 编译)输出是:

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

因此错误是 stat = 1。 我知道 gfortran 具有固有的 HOSTNM,但为了与其他编译器兼容,我更喜欢 GET_ENVIRONMENT_VARIABLE。知道为什么会这样吗?

你导出了HOSTNAME变量了吗?

导出意味着它也可供子进程使用。这很可能就是您遇到的 HOSTNAMEUSER 环境变量之间的区别。

我假设你的 shell 是 bash,但如果实际的 shell 是另一个,最终结果应该不会有太大变化。

在 bash 中,您可以访问 environment variables and to regular bash variables. To make a variable accessible to child process (that is, programs that are launched by bash such as gfortran or your program 'a.out') it has to be part of the environment. By default, only variables from the posix set of environment variables 被传递(尽管可能会省略一些)。

可从 bash 命令行和 Fortran 程序(或与此相关的任何其他程序)访问的 posix 变量示例:HOMEUSERPWDPATH.

您可以通过检查 env 程序知道的内容来验证它们确实可以访问:

env | grep HOME
env | grep USER

env | grep HOSTNAME

returns什么都没有。

因此您需要导出变量 HOSTNAME 以将其放入已知环境变量列表中。 bash 碰巧知道主机名,因为它定义了一组变量以方便用户使用(请参阅 https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-HOSTNAME )。方便变量的另一个示例是 BASH_VERSION,它特定于 bash 本身。

export HOSTNAME
env | grep HOSTNAME

但是您的程序的用户(或您自己,但在另一台计算机上)可能无法将其作为环境变量访问,因此此解决方案可能对您没有用。在 linux 上不依赖环境变量而知道主机名的 "canonical" 方法是执行程序 "hostname".