我正在使用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
。知道为什么会这样吗?
答案 0 :(得分:3)
我认为你的shell是bash但是如果实际的shell是另一个,那么最终的结果不应该改变太多。
在bash中,您可以访问environment variables和常规bash变量。为了使子进程可以访问变量(即由bfort启动的程序,例如gfortran或程序' a.out'),它必须是环境的一部分。默认情况下,只传递posix set of environment variables中的变量(尽管有些可能会被省略)。
可以从bash命令行和fortran程序(或任何其他程序)访问的posix变量示例:HOME
,USER
,PWD
或{ {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
变量?
导出意味着它也可用于子进程。这可能是您遇到的HOSTNAME
和USER
环境变量之间的差异。