2009-03-23 6 views
5

तो मैं एक .sh फ़ाइल है कि निष्पादन योग्य हो जाएगा लिखने के लिए कोशिश कर रहा हूँ जावा के साथ एक निष्पादन .sh फ़ाइल लिखें, यह कैसे मैं वर्तमान में यह लिख रहा हूँ है: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); 
} 

तो फ़ाइल लिखते हैं कि बस ठीक है, लेकिन यह निष्पादन योग्य नहीं है। जब मैं इसे लिखता हूं तो निष्पादन योग्य स्थिति को बदलने का कोई तरीका है?

संपादित करें: आगे स्पष्टीकरण के लिए, मैं इसे डिफ़ॉल्ट रूप से निष्पादित करने की कोशिश कर रहा हूं, उदाहरण के लिए, यदि आप जेनरेट की गई फ़ाइल को डबल क्लिक करते हैं, तो यह स्वचालित रूप से निष्पादित हो जाएगा।

उत्तर

9

आप इसे chmod करना होगा, और आप इसे इस तरह की तरह एक प्रणाली आदेश exec'ing से शायद कर सकते हैं:

Runtime.getRuntime().exec("chmod u+x "+FILENAME); 
: कुछ इस तरह बंद आग

सच आप सभी की जरूरत होता है

लेकिन आप इसे का ट्रैक रखने के लिए करना चाहते हैं और अधिक स्पष्ट रूप पर कब्जा कर सकते हैं stdin/stderr फिर कुछ अधिक की तरह:

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())); 

कौन सा मैं यहाँ से मिला: http://www.devdaily.com/java/edu/pj/pj010016/pj010016.shtml

अद्यतन:

टेस्ट कार्यक्रम:

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(); 
    } 

} 

linux पर अगर आप /tmp/toast.sh पर एक फ़ाइल ब्राउज़र और डबल क्लिक को खोलने और इसे चलाने के लिए चुन यह होना चाहिए, 'हाँ टोस्ट' शब्दों के साथ एक टेक्स्ट फ़ाइल/tmp/toast.txt उत्पन्न करें। मुझे लगता है कि मैक वही करेगा क्योंकि यह हुड के नीचे बीएसडी है।

+0

सुझाव के लिए धन्यवाद! क्या डबल क्लिक होने पर यह स्वचालित रूप से निष्पादित हो जाएगा? – Alan

+0

यह मानना ​​चाहिए कि जावा प्रोग्राम चलाने वाला उपयोगकर्ता वही है जो शेल स्क्रिप्ट चलाएगा। अन्यथा आप chmod को एक + x में समायोजित कर सकते हैं जिसका अर्थ है कि सभी उपयोगकर्ताओं को निष्पादन अनुमति है। मैंने लिनक्स पर एक छोटा परीक्षण कार्यक्रम किया और यह मेरे लिए काम किया। – user49913

+0

आपने दिन के दोस्त को बचाया, मैं जावा के भीतर से एक स्क्रिप्ट को निष्पादित करने के तरीके के आसपास हो रहा था और मुझे जो कुछ करने की ज़रूरत थी उसे 'chmod' कमांड के माध्यम से निष्पादन योग्य बना दिया गया था! धन्यवाद – redDragonzz

16

आप फ़ाइल के मालिक के निष्पादन योग्य बिट को सेट करने के लिए File.setExecutable() पर कॉल कर सकते हैं, जो आपके मामले के लिए पर्याप्त हो सकता है। या आप Process के साथ सिस्टम सिस्टम के साथ chmod कर सकते हैं।

अलास, फ़ाइल अनुमतियों का पूर्ण-संचालित प्रोग्रामेटिक परिवर्तन जावा 7 तक उपलब्ध नहीं है। यह नए आईओ फीचर सेट का हिस्सा होगा, जिसे आप here के बारे में अधिक पढ़ सकते हैं।

+0

धन्यवाद, लेकिन दुर्भाग्य से, मैं 1.5 के साथ काम कर रहा हूं। ओएसएक्स के लिए इसमें काफी व्यापक संगतता होनी चाहिए, और अधिकांश लोगों में 1.6 नहीं है। – Alan

+0

उस स्थिति में, आप सिस्टम कॉल के साथ chmod का उपयोग करने के अपने वैकल्पिक समाधान के साथ अटक गए हैं। माफ़ कीजिये! –

2

मैक ओएस एक्स पर, chmod + x के अलावा, आपको अपनी शेल स्क्रिप्ट में .command एक्सटेंशन देना होगा यदि आप इसे डबल-क्लिक के साथ लॉन्च करना चाहते हैं।

1

पर काम करना चाहिए जावा 7 में आप Files.html#setPosixFilePermissions कॉल कर सकते हैं के माध्यम से एक chmod उदाहरण दिखाता है। यहां एक उदाहरण दिया गया है:

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); 
    } 
}