Java >> Java tutoriál >  >> Java

Proč se mi zobrazuje IOException:„Nelze spustit program ./shellScript.sh chyba =2, Žádný takový soubor nebo adresář v Javě?

Následující kód Main.java se jednoduše pokouší simulovat následující linuxový příkaz:

cd /dir1/dir2
./shellScript.sh

Níže uvedený program funguje pouze v případě, že je spustitelný soubor Main.jar umístěn uvnitř /dir1/dir2, nikoli mimo /dir1/dir2. Jak mohu upravit níže uvedený program, aby Main.jar mohl být umístěn kdekoli v systému souborů?

public class Main {

    public static String runCmdLineProcess(String commandStr){
        String returnVal = "";
        Runtime r = Runtime.getRuntime();
        
        try {
            Process p = r.exec(commandStr);
            BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = ""; 
            
            while ((line = b.readLine()) != null){
                returnVal += line + "n";
            }

        }
        catch(IOException ex){
            ex.printStackTrace();
        }
        
        return returnVal;
    }

    public static void runProcessBuilder(String scriptPath){

        String[] cmd = {scriptPath};
        try {
            runCmdLineProcess("cd /dir1/dir2");
            Runtime.getRuntime().exec(cmd);
        }
        catch (IOException ex){
            ex.printStackTrace();
        }
    }
    
    public static void main(String[] args){
        runProcessBuilder("./shellScript.sh"); // <-- works if I run from inside "/dir1/dir2".  
                                               //But if I'm outside "dir2", get an error message 
                                               // saying "Cannot run program "./shellScript.sh": error = 2, No such file or directory
    }

}

Odpověď

Měli byste použít ProcessBuilder spustit nebo jedno z přetížení exec . Chcete-li skript spustit, musíte zadat cestu ke skriptu a předat stejnou cestu jako aktuální adresář:

File pwd = new File("/dir1/dir2");
String shell = new File(pwd, "shellScript.sh").toString();

ProcessBuilder pb = new ProcessBuilder(shell);
// No STDERR => merge to STDOUT - or call redirectError(File)
pb.redirectErrorStream(true);
// Set CWD for the script
pb.directory(pwd);

Process p = pb.start();

// Move STDOUT to the output stream (or original code to save as String)
try(var stdo = p.getInputStream()) {
    stdo.transferTo(stdout);
}

int rc = p.waitFor();

Java Tag