2009-03-23 10 views
5

Je suis en train d'écrire un fichier .sh qui sera exécutable, voici comment je suis en train d'écrire ce:écrire un fichier exécutable avec .sh Java pour Mac OS X

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

Pour que le fichier écrit très bien, mais ce n'est pas exécutable. Est-il possible de changer le statut de l'exécutable lorsque je l'écris? Edit: Pour clarifier davantage, j'essaie de le faire exécuter par défaut, de sorte que, par exemple, si vous double-cliquez sur le fichier généré, il s'exécutera automatiquement.

Répondre

9

Vous auriez besoin chmod, et vous pouvez probablement le faire par exec'ing une commande système comme tel:

tout ce que vous auriez vraiment besoin est de tirer de quelque chose comme ceci:

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

Mais si vous voulez garder une trace de plus explicitement peut capturer stdin/stderr alors quelque chose comme:

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

ce que je suis d'ici: http://www.devdaily.com/java/edu/pj/pj010016/pj010016.shtml

Mise à jour:

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

} 

Sur linux si vous ouvrez un navigateur de fichiers et double-cliquez sur /tmp/toast.sh et choisissez de l'exécuter, il devrait générer un fichier texte /tmp/toast.txt avec les mots 'ouais toast'. Je suppose que Mac ferait de même puisque c'est BSD sous le capot.

+0

Merci pour la suggestion! Est-ce que cela le rendra automatiquement exécuté en double-cliquant? – Alan

+0

Il devrait, en supposant que l'utilisateur exécutant le programme Java est le même qui va exécuter le script shell. Sinon, vous pouvez ajuster le chmod à un + x, ce qui signifie que tous les utilisateurs ont l'autorisation d'exécution. J'ai fait un petit programme de test sur Linux et cela a fonctionné pour moi. – user49913

+0

Vous avez sauvé le mec du jour, je me débrouillais pour exécuter un script depuis java et il me semblait que tout ce que je devais faire était de le rendre exécutable via la commande 'chmod'! Merci – redDragonzz

16

Vous pouvez appeler File.setExecutable() pour définir le bit exécutable du propriétaire pour le fichier, ce qui peut être suffisant pour votre cas. Ou vous pouvez simplement chmod vous-même avec un appel système avec Process. Hélas, l'altération programmatique complète des autorisations de fichiers n'est pas disponible avant Java 7. Elle fera partie de l'ensemble des nouvelles fonctionnalités d'E/S, que vous pouvez lire plus à propos de here.

+0

Merci, mais malheureusement, je travaille avec 1.5. Il doit avoir une compatibilité assez large pour OSX, et la plupart des gens n'ont pas 1.6. – Alan

+0

Dans ce cas, vous êtes bloqué avec ma solution alternative d'utilisation de chmod avec un appel système. Pardon! –

2

Sur Mac OS X, en plus de chmod + x, vous devez attribuer une extension .command à votre script shell si vous souhaitez le lancer en double-cliquant dessus.

1

En Java 7, vous pouvez appeler Files.html#setPosixFilePermissions. Voici un exemple:

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