【问题标题】:Why exit status always coming 0. What will be the solution为什么退出状态总是为0。解决方案是什么
【发布时间】:2014-10-09 09:09:15
【问题描述】:

以下代码是我的 shell 脚本的一部分。 但我无法理解为什么退出状态(sshStatus)总是为 0? 我想要 ssh 输出以及退出状态。 请帮助我找到解决方案。

local output="$(ssh -q -o ConnectTimeout=10 \
               -o BatchMode=yes \
               -o StrictHostKeyChecking=no \
               -o UserKnownHostsFile=/dev/null \
               $user@$host "$command" 2>&1)"
        local sshStatus=$?

命令可以是:

command="[ ! -d /home/upendra/dfs ]" 
command="cat /home/upendra/a.txt"
command="sh /home/upendra/dfs/bin/start-datanode.sh"

每当我在 shell 提示符下直接调用如下命令时:

ssh -q -o ConnectTimeout=10 \
               -o BatchMode=yes \
               -o StrictHostKeyChecking=no \
               -o UserKnownHostsFile=/dev/null \
               upendra@172.20.20.2 "[ ! -d /home/upendra/dfs ]" 2>&1

然后exit status(echo $?)来了 1.这是正确的,因为这个目录在主机上不存在。

【问题讨论】:

标签: shell


【解决方案1】:

我在这个页面上得到了解决方案:bash shell - ssh remote script capture output and exit code? 这是由于“本地输出”。 – 乌彭德拉

【讨论】:

    【解决方案2】:

    您的command 已成功执行,因此您总是获得0 的exot 状态

    你从本地机器获取的退出状态是ssh session中最后一条命令的退出状态

    例如

    $ ssh localhost
    $ exit 5
    $ echo $?  #on local system
    5
    

    考虑一个没有任何命令的情况

    $ ssh localhost
    $ ls
    #will list commands and exit succussfully
    ctrl+d
    $ echo $?  #on local system
    0 
    

    这里ls命令的退出状态是0,打印出来。

    【讨论】:

    • 但如果 command="[ ! -d /home/upendra/dfs ]",我将获得退出状态 0。服务器上已存在此目录的位置。这里的退出状态应该是 1。
    • 不确定。在我的系统上工作正常。出于好奇,你为什么使用这么多引用。
    【解决方案3】:

    每个命令都返回一个退出状态(有时称为返回状态或退出代码)。成功的命令返回 0,而不成功的命令返回通常可以解释为错误代码的 非零 值。表现良好的 UNIX 命令、程序和实用程序在成功完成后返回 0 退出代码,但也有一些例外。

    同样,脚本中的函数和脚本本身返回退出状态。函数或脚本中执行的最后一个命令确定退出状态。在脚本中,可以使用 exit nnn 命令向 shell 传递 nnn 退出状态(nnn 必须是 整数在 0 - 255 范围内)。

    #!/bin/bash
    
    echo hello 
    echo $?    # Exit status 0 returned because command executed successfully.
    
    lskdf      # Unrecognized command. echo $?    # Non-zero exit status
    returned -- command failed to execute.
    
    echo
    
    exit 113   # Will return 113 to shell.
               # To verify this, type "echo $?" after script terminates.
    

    您的代码返回退出代码0,这意味着您的 shell 脚本执行成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2013-03-24
      • 2018-01-31
      • 2020-07-28
      • 2021-04-14
      • 2011-12-28
      • 2011-12-28
      相关资源
      最近更新 更多