views:

1509

answers:

4

So I am trying to write an .sh file that will be executable, this is how I'm currently writing it:

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 that writes the file just fine, but it is not executable. Is there a way to change the executable status when I write it?

Edit: To further clarify, I am trying to make it execute by default, so that for instance, if you double clicked the generated file, it would automatically execute.

+4  A: 

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.

Thanks for the suggestion! Will this also make it automatically execute when double clicked?
Alan
It should, assuming the user running the java program is the same who will run the shell script. Otherwise you could adjust the chmod to a+x which means all users have execute permission. I did a small test program on linux and it worked for me.
+4  A: 

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.

John Feminella
Thanks, but unfortunately, I'm working with 1.5. It has to have pretty broad compatibility for OSX, and most people don't have 1.6.
Alan
In that case, you're stuck with my alternate solution of using chmod with a system call. Sorry!
John Feminella
+1  A: 

On Mac OS X, besides chmod +x, you have to give a .command extension to your shell script if you want to launch it with a double-click.

mouviciel
+1  A: 

This answer I wrote for the question how do I programmatically change file permissions shows a chmod example via a native call using jna, which should work on Mac OS X.

Marty Lamb