2013-09-07 20 views
6

Fortranコードからファイルを削除する必要があります。私はubuntu 12.04, x86_64です。私は、以下に説明する手順がうまくいかない理由を理解していません。状況を明確にするのを手伝ってください(実際には、システムによっては動作しますが、私のものではありません)。fortranコードからファイルを削除する方法は?

別の方法があります:私は直接UNIXコマンドrm -f fileを呼び出すことができますが、私の方法で何が問題なのかを知りたいと思います。ありがとうございました。

ステップ1は、簡単なスクリプトdel.shを作成し、〜/ビンに

$ 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 file'は動作しますが、Fortranコードからは動作しません。これは混乱します。 Fortranコードから

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

仕事完全に、しかし

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

は動作しません。私はbashをインストールしましたが、cshはありません。ありがとうございました。

+5

を試してみてください、あなたはファイルも「スクラッチ」状態でそれを開き、それを閉じて削除することができることを知っていました。これはすべてのOSで移植可能で、スクリプトを混乱させる必要はなく、OSコマンドでファイルを削除する必要はありません。 – cup

+0

カップと@AlexanderVogt:答えに感謝します。はい、Fortranはファイルを削除できますが、私はそれを知っています。 Fortranコードからスクリプトを呼び出すという考え方は、プログラムをより柔軟にする必要があります。スクリプトは、プロジェクトを再コンパイルせずに、必要に応じて簡単に変更して調整することができます。例えば、ファイルを削除するのではなく、バックアップすることができます。また、別の私の質問は:記載されたアプローチがなぜ機能しないのですか?私はちょうど興味があります... – axion

+1

古いf77標準は実際には単に「SCRATCHは名前付きファイルで指定してはいけません」と言っています。私はどのように名前付きファイルをそのように削除するのが本当に移植性が高いのか分かりません。 – agentp

答えて

1

シェルスクリプトでは、最初の行にプログラムを指定しません。以下を追加してみてください:

#!/bin/bash 

del.shの最初の行です。 bashがそれを起動しないと、/ bin/shでスクリプトを実行しているかもしれません。/ bin/bashではありません。 (今は確認できませんが、bash固有のコードを使用すると、過去に問題があったのを知っていますが、その上にシバンを置くのを忘れてしまいます。)bashがその行を開始すると、代わりにbashで実行する必要があることを確認してください。あなたのコードは、bash引数を直接呼び出すことを示しているようだから、あなたの問題を解決するはずです。 すべて最高です。

+0

user2600110、ありがとうございました。それが私が望むものです。なぜそれが期待どおりに機能しないのかを理解することです。私はスクリプトに対応するヘッダ行を追加しようとしましたが、問題は解決しませんでした。 – axion

2

sourceは、現在のプロセスで(サブプロセスで実行されているのとは対照的に)別のスクリプトを読み込むシェル組み込み関数です。

見つかったとおり、Fortranからスクリプトを呼び出すときには、sourceは必要ありません。 del.shbash del.shの両方が機能し、いずれかの方法でそれを行う必要があります。

+0

ありがとう、ジム。私はそれがこれまでのところ最高の答えだと信じています。だから、ソースを介して '現在のプロセスにスクリプトを読み込む'が間違った意図/スタイルであり、それがなぜ機能しないのですか(または少なくとも動作してはいけません)、正しいのでしょうか?もちろん、私はスクリプトを実行したいが、ロードしない。面白いことに、それは他のマシンでも働いています...私は、Fortranとシェルによって作成されるプロセスの違いは何ですか? (そして私の質問を編集してくれてありがとう)。 – axion

+0

違いはありません、プロセスはプロセスです。他のマシンでも動作している可能性があります。これは、コマンドラインを直接実行するのではなく、コマンドラインを実行するためにシェルが呼び出されたためです。詳細な説明なしには難しいです。 –

29

なぜFortranにあなたのための仕事をさせませんか?このコードは(カップのコメントを比較)ポータブルです:

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

Alexanderと@cup、いずれにしても、私はFortran内のファイルを削除することは、どちらも言及しているように、恐らくより良いスタイルだと思います。ありがとうございました。 – axion

2

systemコールは、システム/環境に依存するシェル、あなたのコマンドを実行するシェルを起動します。 sh: 1: source: not foundを取得したため、呼び出されたシェルはbashの組み込みコマンドであるsourceコマンドを認識しません。Ubuntuでは、デフォルトで/bin/sh/bin/dashにリンクされ、/bin/bashではなく、dashsourceを理解しません。その代わり、.(ポータブル)を使用して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) 

をしかし、あなたは違っそれを持っていますか?その場合は、私を打つ:)

+0

興味深いことに '。 del.sh'、 'sh del.sh'、' source del.sh'のバージョンは動作せず、 'bash del.sh'、' del.sh'も正常に動作します。それはおそらく私の構成のためだけです。私はなぜそれがジムの答えを除いているのか理解していない。しかし、エラーメッセージ "sh:1:source:not found'で掘り起こすべきです。私は多くの変種を試しました。たとえば、 'del.sh'が' $ PATH'にある場合、 'sh del.sh'はコマンドラインからさえも動作しません。ありがとうございました! – axion

+0

"shスクリプト"を実行すると、shはパス上になければなりませんが、スクリプトのパスは検索されません。現在のディレクトリになければなりません。私の意見では、最も安全なアプローチ(Linuxと仮定)は、スクリプトを適切なシバンラインhttp://en.wikipedia.org/wiki/Shebang_%28Unix%29で実行可能にしてから、スクリプトを直接実行することです(ソースを作成しないでください。他のサブシェルを呼び出さないようにしてください)(すなわち、最後のsteabertsがアプローチします) – agentp

+0

@george:はい、それは私の間違ったことです:source、サブシェルを起動して実行してください。また、Fortranで 'system'コマンドを実行すると、コマンドライン(' source del.sh ')として動作するものは動作しなければならないと私は信じていました。どうやらそれはうまく動作しないかもしれません。私はシバンのオプションをチェックします - ありがとう。 – axion

-1

call system(trim(cmd)) 
+0

トリムで 'system'ステートメントに違いはありません。 –

関連する問題