【问题标题】:Write an executable .sh file with Java for OSX用 Java 为 OSX 编写一个可执行的 .sh 文件
【发布时间】:2010-10-14 23:50:01
【问题描述】:

所以我正在尝试编写一个可执行的 .sh 文件,这就是我目前的编写方式:

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

这样可以很好地写入文件,但它不可执行。有没有办法在我写的时候改变可执行状态?

编辑:为了进一步澄清,我试图让它默认执行,例如,如果你双击生成的文件,它会自动执行。

【问题讨论】:

    标签: java shell scripting executable sh


    【解决方案1】:

    您需要对其进行 chmod,并且您可以通过执行这样的系统命令来做到这一点:

    你真正需要的只是启动这样的东西:

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

    但如果你想更明确地跟踪它,可以捕获 stdin / stderr 然后更像:

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

    我从这里得到的: http://www.devdaily.com/java/edu/pj/pj010016/pj010016.shtml

    更新:

    测试程序:

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

    在 Linux 上,如果您打开文件浏览器并双击 /tmp/toast.sh 并选择运行它,它应该会生成一个带有“yeah toast”字样的文本文件 /tmp/toast.txt。我认为 Mac 也会这样做,因为它的底层是 BSD。

    【讨论】:

    • 感谢您的建议!这也会让它在双击时自动执行吗?
    • 应该,假设运行java程序的用户是运行shell脚本的用户。否则,您可以将 chmod 调整为 a+x,这意味着所有用户都有执行权限。我在 linux 上做了一个小测试程序,它对我有用。
    • 老兄,你拯救了这一天,我正在研究如何从 java 中执行脚本,结果我需要做的就是通过chmod 命令使其可执行!谢谢
    【解决方案2】:

    您可以调用File.setExecutable() 为文件设置所有者的可执行位,这对于您的情况可能已经足够了。或者您可以自己使用Process 进行系统调用chmod

    唉,文件权限的全功能编程更改直到 Java 7 才可用。它将成为新 IO 功能集的一部分,您可以阅读有关 here 的更多信息。

    【讨论】:

    • 谢谢,但不幸的是,我正在使用 1.5。它必须对 OSX 具有相当广泛的兼容性,而大多数人没有 1.6。
    • 在这种情况下,您会被我的替代解决方案所困扰,即在系统调用中使用 chmod。对不起!
    【解决方案3】:

    在 Mac OS X 上,除了 chmod +x,如果你想双击启动它,你必须给你的 shell 脚本一个 .command 扩展。

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

        在 Java 7 中,您可以调用 Files.setPosixFilePermissions。这是一个例子:

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

        【讨论】:

          猜你喜欢
          • 2017-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-10
          • 2011-09-21
          • 1970-01-01
          • 1970-01-01
          • 2012-12-06
          相关资源
          最近更新 更多