使用gfortran

时间:2017-05-17 11:53:33

标签: fortran 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。知道为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

我认为你的shell是bash但是如果实际的shell是另一个,那么最终的结果不应该改变太多。

在bash中,您可以访问environment variables和常规bash变量。为了使子进程可以访问变量(即由bfort启动的程序,例如gfortran或程序' a.out'),它必须是环境的一部分。默认情况下,只传递posix set of environment variables中的变量(尽管有些可能会被省略)。

可以从bash命令行和fortran程序(或任何其他程序)访问的posix变量示例:HOMEUSERPWD或{ {1}}。

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

env

,而

env | grep HOME
env | grep USER

什么都不返回。

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

BASH_VERSION

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

答案 1 :(得分:1)

您是否导出了HOSTNAME变量?

导出意味着它也可用于子进程。这可能是您遇到的HOSTNAMEUSER环境变量之间的差异。