12

我需要从Fortran代码中删除文件。我在ubuntu 12.04, x86_64。我不明白为什么下面描述的过程不起作用。请帮助我澄清情况(实际上,在某些系统上,它有效,但不适用于我的)。

还有另一种方法:我可以直接调用 unix command rm -f file,但我想知道我的方法有什么问题。谢谢你。

步骤 1. 制作简单的脚本 del.sh 并放入 ~/bin

$ cat del.sh
[ $# -ge 1 ] && rm -f $1
$ chmod u+x del.sh; mv del.sh ~/bin 

步骤 2. Fortran 代码,del.for:

character*100 cmd
character*30 file
call getarg(1,file)
write(cmd,100) file
100   format('source del.sh ',a30)
call system(cmd)
end

步骤 3. 编译并运行:

$ ifort -o del del.for
$ ./del file

结果:

sh: 1: source: not found

怎么了?简单的“源 del.sh 文件”有效,但不是来自 Fortran 代码……这令人困惑。

来自 Fortran 代码:

100 format('del.sh ',a30)
100 format('bash del.sh ',a30)

工作完美,但是

100 format('sh del.sh ',a30)

不起作用。我已经bash安装了,但是没有csh。谢谢你。

4

5 回答 5

43

为什么不让 Fortran 为您完成这项工作?此代码是可移植的(比较 cup 的评论):

open(unit=1234, iostat=stat, file=file, status='old')
if (stat == 0) close(1234, status='delete')
于 2013-09-07T08:44:19.863 回答
2

system调用调用外壳程序来执行您的命令,该外壳程序取决于系统/环境。既然你得到sh: 1: source: not found了,被调用的 shell 不理解source命令,这是一个bash内置命令。在 Ubuntu 上,默认情况下/bin/sh链接到/bin/dash、not/bin/bashdash不理解source. 相反,使用.(portable) 内置而不是source

100   format('. del.sh ',a30)

应该工作,如果del.sh在你的$PATH.

这就是为什么我认为这些都应该起作用的原因:

100 format('sh del.sh ',a30)
100 format('bash del.sh ',a30)
100 format('del.sh ',a30)

但你有不同吗?在那种情况下,打败我:)

于 2013-09-07T10:04:45.410 回答
2

source是一个内置的 shell,它在当前进程中加载​​另一个脚本(而不是在子进程中运行它)。

正如您所发现的,您不需要source从 Fortran 调用脚本。两者都 del.sh有效bash del.sh,其中任何一个都代表了您应该做的方式。

于 2013-09-07T03:19:56.817 回答
1

因此,在您的 shell 脚本中,您没有在第一行指定程序。尝试添加:

#!/bin/bash

作为 del.sh 的第一行。当 bash 在没有它的情况下启动它时,它可能正在运行带有 /bin/sh 的脚本,而不是您期望的 /bin/bash。(我现在无法确认,但我知道如果我使用特定于 bash 的代码但忘记将 shebang 放在顶部,我过去会遇到麻烦。)当 bash 从该行开始时,它将看到它需要用 bash 来执行。由于您的代码似乎表明直接将其作为 bash 参数调用是有效的,因此我认为这应该可以解决您的问题。一切顺利。

于 2013-09-07T01:57:57.863 回答
1

请试试

call system(trim(cmd))
于 2017-08-07T04:53:00.163 回答