2009-03-23 4 views
5

Also ich versuche, eine .sh-Datei zu schreiben, die ausführbar sein werden, ist dies, wie ich zur Zeit es hier schreibe:Schreibe eine ausführbare .sh-Datei mit Java für 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); 
} 

so dass schreibt die Datei gut, aber es ist nicht ausführbar. Gibt es eine Möglichkeit, den ausführbaren Status zu ändern, wenn ich es schreibe?

Edit: Zur weiteren Klärung, ich versuche, es standardmäßig ausführen, so dass zum Beispiel, wenn Sie auf die generierte Datei doppelklicken, würde es automatisch ausgeführt werden.

Antwort

9

Sie benötigen würde es chmod, und Sie können es wahrscheinlich tun, indem Sie einen Systembefehl wie solche exec'ing:

wirklich alles, was Sie brauchen würde, ist so etwas wie dies abzufeuern:

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

Aber wenn Sie den Überblick über sie behalten wollen mehr explizit erfassen stdin/stderr dann etwas wie:

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

was ich von hier bekam: http://www.devdaily.com/java/edu/pj/pj010016/pj010016.shtml

Update:

Testprogramm:

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

} 

auf Linux, wenn Sie einen Dateibrowser, und doppelklicken Sie auf /tmp/toast.sh öffnen und sie ausführen möchten, sollte es erzeuge eine Textdatei /tmp/toast.txt mit den Worten "yeah toast". Ich nehme an, Mac würde das Gleiche tun, da es BSD unter der Haube ist.

+0

Danke für den Vorschlag! Wird dies auch automatisch beim Doppelklick ausgeführt? – Alan

+0

Es sollte, vorausgesetzt, der Benutzer, der das Java-Programm ausführt, ist derselbe, der das Shell-Skript ausführt. Andernfalls könnten Sie chmod auf ein + x einstellen, was bedeutet, dass alle Benutzer die Ausführungsberechtigung haben. Ich habe ein kleines Testprogramm auf Linux gemacht und es hat für mich funktioniert. – user49913

+0

Sie speicherten den Tag-Typ, ich kam herum, wie man ein Skript innerhalb von Java ausführt, und alles, was ich tun musste, war, es über den 'chmod'-Befehl ausführbar zu machen! Danke – redDragonzz

16

Sie können File.setExecutable() aufrufen, um das ausführbare Bit des Eigentümers für die Datei festzulegen, das für Ihren Fall ausreichen könnte. Oder du kannst einfach chmod selbst mit einem Systemanruf mit Process.

Leider ist die vollständige programmatische Änderung der Dateiberechtigungen erst ab Java 7 verfügbar. Sie wird Teil des neuen IO-Funktionssatzes sein, den Sie mehr über here lesen können.

+0

Danke, aber leider arbeite ich mit 1.5. Es muss ziemlich breite Kompatibilität für OSX haben, und die meisten Leute haben nicht 1.6. – Alan

+0

In diesem Fall sind Sie mit meiner alternativen Lösung der Verwendung von chmod mit einem Systemaufruf fest. Es tut uns leid! –

2

Unter Mac OS X müssen Sie neben chmod + x eine .command Erweiterung für Ihr Shell-Skript angeben, wenn Sie es mit einem Doppelklick starten möchten.

1

In Java 7 funktionieren sollte Files.html#setPosixFilePermissions aufrufen können. Hier ein Beispiel:

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