【问题标题】:Execute command line and return command output执行命令行并返回命令输出
【发布时间】:2011-12-11 22:50:18
【问题描述】:

目前,我使用非标准 SYSTEM 内部例程(类似于 Fortran 2008 EXECUTE_COMMAND_LINE 内部)从我的 fortran 程序中使用 shell 命令行调用:

CALL SYSTEM(commandStr)

其中 commandStr 是一个字符串,其中包含我要执行的 shell 命令。目前,我不知道返回 commandStr 输出的直接方法,而只是返回它的返回状态。所以,我现在正在做的是将输出写入文件,然后从 Fortran 程序中读取文件。示例:

CALL SYSTEM('sed ''s/,//g'' myFile > dummyFile')

如果我想从 myFile 中删除逗号。然后我使用 OPEN 和 READ 来获取 dummyFile 的内容。

这很好用,但是我担心从磁盘写入/读取文件,特别是如果我在一个长循环中执行此操作,并且 commandStr 输出很大。有没有办法将 commandStr 输出重定向到内存缓冲区(不是硬盘),我可以直接从我的 Fortran 程序访问(可能通过特定的 UNIT 编号)?

【问题讨论】:

  • 如果输出很大,将其存储到文件中不是更有意义吗?
  • 我想这不会对代码产生影响——我唯一担心的部分是频繁的磁盘 I/O 影响程序效率。是否有理由将它存储到文件中更好,这是我遗漏的东西?
  • 好吧,在我看来,这只是一个实用性问题。如果不是很多数据,则将其存储到文件中无关紧要。它是很多数据,我在当前运行的程序中重用它,我想要的最后一个地方是内存。我需要内存来存储“解析”该文件的结果,然后对这些结果进行处理。这可能会得到更好的解释,但我想你明白了。
  • 我感觉你正在尝试解决你没有的问题。
  • @eriktous 我同意,我现在所做的工作有效,但问题仍然存在,有没有其他方法可以做到?

标签: linux shell posix fortran


【解决方案1】:

如果这是在 POSIX 环境中,库函数 popen() 也可能可用。

iunit = popen ('sed ''s/,//g'' myFile', 'r')

查看 Fortran 环境的文档,因为我不确定将 i/o 连接到 Fortran 的语义。如果像 C 运行时库,文件连接也需要一个特殊的函数来关闭它,pclose()

【讨论】: