Write an executable .sh file with Java for OSX Write an executable .sh file with Java for OSX shell shell

Write an executable .sh file with Java for OSX


You can call File.setExecutable() to set the owner's executable bit for the file, which might be sufficient for your case. Or you can just chmod it yourself with a system call with Process.

Alas, full-powered programmatic alteration of file permissions isn't available until Java 7. It'll be part of the New IO feature set, which you can read more about here.


You'd need to chmod it, and you can probably do it by exec'ing a system command like such:

Really all you'd need is to fire off something like this:

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

But if you want to keep track of it more explicitly can capture stdin / stderr then something more like:

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

Which I got from here: http://www.devdaily.com/java/edu/pj/pj010016/pj010016.shtml

Update:

Test program:

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

On linux if you open up a file browser and double click on /tmp/toast.sh and choose to run it, it should generate a text file /tmp/toast.txt with the words 'yeah toast'. I assume Mac would do the same since it's BSD under the hood.


In Java 7 you can call Files.setPosixFilePermissions. Here is an example:

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