2009-03-23 15 views
5

Così sto cercando di scrivere un file .sh che sarà eseguibile, questo è il modo Attualmente sto scrivendo:scrivere un file eseguibile Sh con Java per 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); 
} 

Così scrive il file bene, ma non è eseguibile C'è un modo per cambiare lo stato dell'eseguibile quando lo scrivo?

Modifica: per chiarire ulteriormente, sto tentando di eseguirlo per impostazione predefinita, in modo che, ad esempio, se si fa doppio clic sul file generato, esso venga eseguito automaticamente.

risposta

9

Avresti bisogno di chmod, e probabilmente lo si può fare da exec'ing un comando di sistema, come ad esempio:

davvero tutto ciò che ci si serve è quello di sparare qualcosa di simile:

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

Ma se si vuole tenere traccia di esso in modo più esplicito in grado di catturare stdin/stderr quindi qualcosa di più simile:

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

che ho avuto da qui: http://www.devdaily.com/java/edu/pj/pj010016/pj010016.shtml

Aggiornamento:

programma di test:

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

} 

Su Linux, se si apre un browser di file e fare doppio clic su /tmp/toast.sh e sceglie di farlo funzionare, dovrebbe genera un file di testo /tmp/toast.txt con le parole 'yeah toast'. Presumo che Mac farebbe lo stesso dal momento che è BSD sotto il cofano.

+0

Grazie per il suggerimento! Anche questo verrà eseguito automaticamente quando si fa doppio clic? – Alan

+0

Dovrebbe, presumendo che l'utente che esegue il programma java sia lo stesso che eseguirà lo script della shell. Altrimenti puoi regolare il chmod su + x, il che significa che tutti gli utenti hanno il permesso di esecuzione. Ho fatto un piccolo programma di test su Linux e ha funzionato per me. – user49913

+0

Hai salvato il tizio del giorno, mi stavo spostando su come eseguire uno script all'interno di java e tutto ciò che dovevo fare era renderlo eseguibile tramite il comando 'chmod'! Grazie – redDragonzz

16

È possibile chiamare File.setExecutable() per impostare il bit eseguibile del proprietario per il file, che potrebbe essere sufficiente per il proprio caso. Oppure puoi semplicemente effettuare il chmod con una chiamata di sistema con Process.

Purtroppo l'alterazione programmatica delle autorizzazioni di file non è disponibile fino a Java 7. Farà parte del nuovo set di funzionalità IO, che è possibile leggere di più su here.

+0

Grazie, ma sfortunatamente, sto lavorando con 1.5. Deve avere una compatibilità abbastanza ampia per OSX e la maggior parte delle persone non ha 1.6. – Alan

+0

In questo caso, sei bloccato con la mia soluzione alternativa di usare chmod con una chiamata di sistema. Scusate! –

2

Su Mac OS X, oltre a chmod + x, devi dare un'estensione .command allo script della shell se vuoi avviarla con un doppio clic.

1

In Java 7 è possibile chiamare Files.html#setPosixFilePermissions. Ecco un esempio:

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