2009-03-23 26 views
5

Vì vậy, tôi đang cố gắng để viết một file sh sẽ được thực thi, đây là cách tôi đang viết nó:Viết một file sh thực thi với Java cho OSX

Writer output = null; 

try { 
    output = new BufferedWriter(new FileWriter(file2)); 
    output.write(shellScriptContent); 
    output.close(); 
} catch (IOException ex) { 
    Logger.getLogger(PunchGUI.class.getName()).log(Level.SEVERE, null, ex); 
} 

Vì vậy mà viết các tập tin tốt, nhưng nó không thực thi được. Có cách nào để thay đổi trạng thái thực thi khi tôi viết nó không?

Chỉnh sửa: Để làm rõ hơn, tôi đang cố gắng thực hiện theo mặc định, do đó, ví dụ: nếu bạn nhấp đúp vào tệp được tạo, nó sẽ tự động thực thi.

Trả lời

9

Bạn sẽ cần phải chmod nó, và có lẽ bạn có thể làm điều đó bằng cách exec'ing một lệnh hệ thống như vậy:

Thật tất cả bạn cần là để bắn ra một cái gì đó như thế này:

Runtime.getRuntime().exec("chmod u+x "+FILENAME); 

Nhưng nếu bạn muốn theo dõi nó một cách rõ ràng hơn có thể chụp stdin/stderr sau đó một cái gì đó giống như:

Process p = Runtime.getRuntime().exec("chmod u+x "+FILENAME); 
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));  
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

nào tôi nhận được từ đây: http://www.devdaily.com/java/edu/pj/pj010016/pj010016.shtml

Cập nhật:

chương trình thử nghiệm:

package junk; 
import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.Writer; 

public class Main{ 
    private String scriptContent = '#!/bin/bash \n echo "yeah toast!" > /tmp/toast.txt'; 
    public void doIt(){ 
    try{ 
     Writer output = new BufferedWriter(new FileWriter("/tmp/toast.sh")); 
     output.write(scriptContent); 
     output.close(); 
     Runtime.getRuntime().exec("chmod u+x /tmp/toast.sh"); 
    }catch (IOException ex){} 
    } 

    public static void main(String[] args){ 
    Main m = new Main(); 
    m.doIt(); 
    } 

} 

Trên Linux nếu bạn mở một trình duyệt tập tin và kích đúp vào /tmp/toast.sh và chọn để chạy nó, nó nên tạo một tập tin văn bản /tmp/toast.txt với các từ 'yeah toast'. Tôi cho rằng Mac sẽ làm tương tự vì nó là BSD dưới mui xe.

+0

Cảm ơn đề xuất! Điều này cũng sẽ làm cho nó tự động thực hiện khi nhấp đúp? – Alan

+0

Cần giả sử người dùng chạy chương trình java giống như người sẽ chạy tập lệnh shell. Nếu không, bạn có thể điều chỉnh chmod thành + x có nghĩa là tất cả người dùng đều có quyền thực thi. Tôi đã làm một chương trình thử nghiệm nhỏ trên Linux và nó làm việc cho tôi. – user49913

+0

Bạn đã lưu ngày dude, tôi đã nhận được xung quanh làm thế nào để thực hiện một kịch bản từ bên trong java và chỉ ra tất cả tôi cần làm là làm cho nó thực thi thông qua lệnh 'chmod'! Cảm ơn – redDragonzz

16

Bạn có thể gọi File.setExecutable() để đặt bit thực thi của chủ sở hữu cho tệp, điều này có thể đủ cho trường hợp của bạn. Hoặc bạn chỉ có thể tự mình gọi chmod bằng cuộc gọi hệ thống với Process.

Than ôi, thay đổi có lập trình đầy đủ quyền của tệp không có sẵn cho đến khi Java 7. Nó sẽ là một phần của bộ tính năng mới IO, mà bạn có thể đọc thêm về here.

+0

Cảm ơn, nhưng thật không may, tôi đang làm việc với 1.5. Nó phải có khả năng tương thích khá rộng đối với OSX và hầu hết mọi người không có 1.6. – Alan

+0

Trong trường hợp đó, bạn đang mắc kẹt với giải pháp thay thế của tôi bằng cách sử dụng chmod với một cuộc gọi hệ thống. Lấy làm tiếc! –

2

Trên Mac OS X, bên cạnh chmod + x, bạn phải cung cấp phần mở rộng .command cho tập lệnh hệ vỏ nếu bạn muốn khởi chạy nó bằng một cú nhấp đúp.

1

Trong Java 7 bạn có thể gọi Files.html#setPosixFilePermissions. Dưới đây là ví dụ:

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.PosixFilePermission; 
import java.util.Set; 

class FilePermissionExample { 
    public static void main(String[] args) throws IOException { 
    final Path filepath = Paths.get("path", "to", "file.txt"); 
    final Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(filepath); 
    permissions.add(PosixFilePermission.OWNER_EXECUTE); 
    Files.setPosixFilePermissions(filepath, permissions); 
    } 
} 
Các vấn đề liên quan