【问题标题】:How to seperate normal exit or error of execution of bash script如何区分bash脚本的正常退出或执行错误
【发布时间】:2014-07-11 15:33:44
【问题描述】:

我将从 Java 执行一个 bash 脚本,我的问题是如何区分正常退出和失败退出。

我知道理论上它返回 0 表示正常退出,而返回非 0 表示其他退出。但是如果脚本调用 "exit 1""exit 255" 怎么办?如果“exit 127”会返回 127 但没有“command not found”错误。

我发现的唯一方法是准备好 errOutputFile 但它看起来很愚蠢......

PS:我使用 Process.waitfor() 来获取退出代码。

【问题讨论】:

  • 您能否详细说明这部分:“如果“退出127”将返回127,但没有“找不到命令”错误。”
  • @Drux 我的意思是对于 bash 脚本,如果它执行一个不存在的命令,il 将返回错误代码 127,表示“找不到命令”。例如,“qjzoiegj”。但是我也可以执行“exit 127”来获得 127 的返回值。这就是为什么我说我无法区分成功执行和失败的执行。
  • 我明白了。在这种情况下,我认为您确实必须查看输出(不仅仅是退出代码)才能做出确切的区分。
  • @java_learner "我也可以执行exit 127得到127的返回值"你不用exit返回一个值乙>。您使用它返回一个退出代码。按照惯例,0 表示 OK。任何其他都意味着有错误。如果您的脚本需要“返回某个值”,它应该将其写入其标准输出并以状态码 0 终止。

标签: java bash


【解决方案1】:

Process.waitFor() ref. here 将返回此 Process 对象所代表的子进程的退出值。按照惯例,值 0 表示正常终止。因此,如果您使用 exit,您将获得指定的退出代码。

*您得到的命令未找到错误是不言自明的。

   public static void main(String[] args) {    
        String[] cmd = { "/bin/sh", "-c", "/tmp/test.sh" };
        BufferedReader bri = null, bre = null;
        int exitC = 0;
        try {
            Process p = Runtime.getRuntime().exec(cmd);
            exitC = p.waitFor();
            bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
            bre = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            String line = "";
            while ((line = bri.readLine()) != null) {
                System.out.println(line);               
            }
            while ((line = bre.readLine()) != null) {
                System.out.println(line);
            }
            bri.close();
            bre.close();
        } catch (Exception e) {
            e.printStackTrace();
        } 
        System.out.println("Exit Code: "+ exitC);
    }

Bash 测试.sh

#!/bin/bash
echo Hello World
exit 127

控制台

Hello World
Exit Code: 127

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2013-09-07
    • 2022-06-10
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多