如何从fortran代码中删除文件?

时间:2013-09-07 01:43:41

标签: linux bash file shell fortran

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

还有另外一种方法:我可以直接调用unix命令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

有什么问题?简单的'source del.sh文件'可以工作,但不是Fortran代码......这很令人困惑。

来自Fortran代码:

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

完美地工作,但

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

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

5 个答案:

答案 0 :(得分:33)

为什么不让Fortran为你做这项工作?这段代码是可移植的(比较杯子的评论):

open(unit=1234, iostat=stat, file=file, status='old')
if (stat == 0) close(1234, status='delete')

答案 1 :(得分:2)

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

当你发现从Fortran调用脚本时,你不需要source。都 del.shbash del.sh有效,其中任何一个代表了您应该这样做的方式。

答案 2 :(得分:2)

system调用调用shell来执行命令,该shell依赖于系统/环境。由于得到sh: 1: source: not found,因此调用的shell不理解source命令,它是bash内置命令。在Ubuntu上,默认情况下/bin/sh/bin/dash相关联,而不是/bin/bashdash无法理解source。相反,使用.(可移植)内置而不是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)

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

答案 3 :(得分:1)

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

#!/bin/bash

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

答案 4 :(得分:1)

请尝试

call system(trim(cmd))