2013-09-07 100 views
6

Tôi cần xóa tệp khỏi mã Fortran. Tôi đang ở số ubuntu 12.04, x86_64. Tôi không hiểu tại sao quy trình được mô tả bên dưới không hoạt động. Xin hãy giúp tôi làm rõ tình hình (trên thực tế, trên một số hệ thống, nó hoạt động, nhưng không phải của tôi).Cách xóa tệp từ mã fortran?

Có một cách khác: Tôi có thể gọi lệnh unix trực tiếp rm -f file, nhưng tôi muốn biết có gì sai với phương pháp của mình. Cảm ơn bạn.

Bước 1. làm cho kịch bản del.sh đơn giản và đặt nó vào ~/bin

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

Bước 2. Mã 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 

Bước 3. Biên dịch và chạy :

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

Kết quả:

sh: 1: source: not found 

Điều gì là sai? Tệp 'source del.sh' đơn giản hoạt động, nhưng không phải từ mã Fortran ... gây nhầm lẫn.

Từ mã Fortran:

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

công việc một cách hoàn hảo, nhưng

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

không hoạt động. Tôi đã cài đặt bash nhưng không có csh. Cảm ơn bạn.

+5

Bạn có biết rằng một tập tin cũng có thể được xóa bằng cách mở nó với tình trạng 'CÀO' và sau đó đóng nó. Đây là thiết bị di động trên tất cả các hệ điều hành và không cần phải gây rối với các tập lệnh hoặc lệnh OS là gì để xóa tệp. – cup

+0

cup và @AlexanderVogt: cảm ơn bạn đã trả lời. Có, Fortran có thể xóa tệp, tôi biết điều đó. Ý tưởng gọi kịch bản từ mã Fortran sẽ làm cho chương trình của bạn linh hoạt hơn: tập lệnh có thể dễ dàng sửa đổi và điều chỉnh theo nhu cầu của bạn mà không cần biên dịch lại dự án. Ví dụ, thay vì xóa tập tin, tôi có thể sao lưu nó và vân vân. Một câu hỏi khác của tôi là: tại sao phương pháp mô tả không hoạt động? Tôi chỉ tò mò ... – axion

+1

tiêu chuẩn cũ f77 thực sự chỉ đơn giản là nói "SCRATCH không được chỉ định với một tập tin có tên". Tôi không biết làm thế nào cầm tay mà thực sự là để xóa một tập tin được đặt tên theo cách đó? – agentp

Trả lời

1

Vì vậy, trong tập lệnh trình bao, bạn không chỉ định chương trình trong dòng đầu tiên. Hãy thử thêm:

#!/bin/bash 

làm dòng đầu tiên trong del.sh. Khi bash khởi động nó mà không có nó, nó có thể chạy script với/bin/sh, không/bin/bash như bạn mong đợi. (Tôi không thể xác nhận ngay bây giờ, nhưng tôi biết tôi đã gặp rắc rối trong quá khứ nếu tôi sử dụng mã bash-cụ thể nhưng quên để đưa các shebang ở đầu trang.) Khi bash bắt đầu nó với dòng đó, nó sẽ thấy rằng nó cần phải được thực hiện với bash thay vào đó. Kể từ khi mã của bạn xuất hiện để cho thấy rằng gọi nó như là một đối số bash trực tiếp hoạt động, tôi muốn nói điều này sẽ khắc phục vấn đề của bạn. Tất cả tốt nhất.

+0

user2600110, cảm ơn bạn đã trả lời. Đó là điều tôi muốn - để hiểu tại sao nó không hoạt động như mong đợi. Tôi đã cố gắng thêm các dòng tiêu đề tương ứng (như bạn đã đề cập) vào tập lệnh - nó không giải quyết được vấn đề. – axion

2

source là nội trang hệ vỏ tải một tập lệnh khác trong quy trình hiện tại (trái ngược với việc chạy tập lệnh trong quy trình con).

Bạn không cần source khi gọi một tập lệnh từ Fortran, như bạn đã phát hiện ra. Cả hai del.shbash del.sh đều hoạt động và một trong hai cách đó đại diện cho cách bạn nên làm.

+0

Cảm ơn bạn, Jim. Tôi tin rằng đó là câu trả lời tốt nhất cho đến nay. Vì vậy, 'tải kịch bản vào quá trình hiện tại' thông qua nguồn là một ý định sai/phong cách và đó là lý do tại sao nó không hoạt động (hoặc không nên làm việc ít nhất), chính xác? Tất nhiên, tôi muốn thực thi kịch bản, nhưng không phải để tải nó. Thú vị, rằng nó làm việc trên các máy khác ... Tôi có thể hỏi sự khác biệt giữa các quá trình được tạo ra bởi Fortran và vỏ là gì? (và cảm ơn bạn đã chỉnh sửa câu hỏi của tôi). – axion

+0

Không có sự khác biệt, quá trình là một quá trình. Nó có thể đã làm việc trên các máy khác, có thể bởi vì việc thực thi đã gọi một trình bao để thực thi dòng lệnh của bạn, trái ngược với việc chạy nó trực tiếp. Thật khó để nói mà không có thêm chi tiết. –

29

Tại sao không để Fortran thực hiện công việc cho bạn? Mã này là di động (so sánh bình luận của cốc):

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

Alexander và @cup, trong bất kỳ trường hợp nào, tôi nghĩ rằng việc xóa tệp trong Fortran vì cả hai bạn đã đề cập đến, có thể là một kiểu tốt hơn. Cảm ơn bạn. – axion

2

Gọi hàm shell để thực thi lệnh của bạn, trình bao phụ thuộc vào hệ thống/môi trường. Kể từ khi bạn nhận được sh: 1: source: not found, vỏ được gọi không hiểu lệnh source, được xây dựng là bash.Trên Ubuntu, theo mặc định, /bin/sh được liên kết với /bin/dash, không phải /bin/bashdash không hiểu source. Thay vào đó, sử dụng . (portable) dựng sẵn thay vì source:

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

nên làm việc, nếu del.sh là trong $PATH của bạn.

Đây là lý do tại sao tôi nghĩ rằng những nên mọi công việc:

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

Nhưng bạn có nó khác nhau? Trong trường hợp đó, nhịp đập tôi :)

+0

Thú vị là '. Các phiên bản del.sh', 'sh del.sh' và' source del.sh' không hoạt động và 'bash del.sh',' del.sh' hoạt động tốt. Nó có thể chỉ vì cấu hình của tôi. Tôi không hiểu tại sao nó lại ngoại trừ câu trả lời của Jim. Nhưng bạn nói đúng là chúng ta nên bắt đầu đào với thông báo lỗi: 'sh: 1: source: not found'. Tôi đã thử nhiều biến thể, ví dụ 'sh del.sh' không hoạt động ngay cả từ dòng lệnh nếu' del.sh' nằm trong '$ PATH', nếu tôi lưu tập lệnh cục bộ thì' sh' hoạt động. Cảm ơn bạn! – axion

+0

khi bạn thực hiện "sh script", sh phải nằm trên đường dẫn của bạn, nhưng đường dẫn không được tìm kiếm cho tập lệnh, nó phải nằm trong thư mục hiện tại. Ý kiến ​​của tôi cách tiếp cận an toàn nhất (giả sử linux) ở đây là làm cho tập lệnh thực thi với một dòng shebang thích hợp http://en.wikipedia.org/wiki/Shebang_%28Unix%29, sau đó thực hiện trực tiếp kịch bản lệnh (không nguồn, làm không gọi một sub shell khác) (tức là cuối cùng của phương thức steaberts) – agentp

+0

@george: vâng, đó là sự hiểu lầm của tôi giữa: source, gọi một shell con và thực thi.Ngoài ra tôi tin rằng bất cứ thứ gì hoạt động từ dòng lệnh (như 'source del.sh') phải hoạt động khi được gọi với lệnh' system' trong Fortran. Dường như nó có thể hoặc có thể không hoạt động. Tôi sẽ kiểm tra tùy chọn shebang - cảm ơn bạn. – axion

-1

Vui lòng thử

call system(trim(cmd)) 
+0

Cắt không được gây ra bất kỳ sự khác biệt nào trong câu lệnh 'hệ thống'. –