【问题标题】:Get return code of ssh command in bash在 bash 中获取 ssh 命令的返回码
【发布时间】:2017-10-05 09:30:01
【问题描述】:

我需要在我的 bash 脚本中获取 ssh 命令的返回/错误代码。该命令使用 applescript 将远程机器上的文件移动到垃圾箱。这是一个更大的脚本的一部分:

ssh $login "bash -s" <<-EOF
    error=(osascript -e "tell application \"Finder\" to move POSIX file \"$remote_filepath\" to trash");
    [[ -n "$error" ]] && { echo -e "\nCannot move file to trash on remote mac"; exit 1; };
EOF
# echo $?; exit
[[ $? -ne 0 ]] && exit 1
# more code ...

如果 osascript 失败,我的目标是让 ssh 命令以代码 1 退出,这样我就可以捕获错误并中止脚本的其余部分。

ssh 运行成功,文件确实被移到了垃圾箱。显然 osascript 运行良好,因为没有显示错误消息。尽管如此,ssh 返回码还是 1(我用 echo $? 语句检查了它。这就是我卡住的地方。我很感激任何关于这里有什么问题的见解。

【问题讨论】:

  • 我假设在输入此内容时您错过了error=$(osascript ... 中的$,因为没有它,脚本当然不会运行。
  • 嗯。不,$ 不存在。为什么应该这样?这是一个局部变量。该文件在没有 $ 的情况下被丢弃。
  • 双括号是你的麻烦:[ $? -ne 0 ] &amp;&amp; exit
  • @F.Hauri 双括号和单括号在这里做同样的事情。
  • 命令error=(osascript -e "foo") 不执行任何操作。它创建一个包含三个元素的数组。要执行命令并捕获输出,这是我假设你想要做的,你需要说error=$(osascript -e "foo")。

标签: bash macos ssh


【解决方案1】:

问题在于[[ -n "$error" ]] 命令将错误代码设置为1。您需要使用该测试的否定。试试:

[[ -z "$error" ]] || { echo -e ...

【讨论】:

  • @Timm 很高兴我能帮上忙。最佳实践是在检查错误时始终使用此否定测试,因为它保留了成功代码。例如,如果是我,我会以同样的方式更改最后一行,甚至只是在 ssh 命令的末尾添加|| exit。这将做同样的事情。没有参数exit 将使用$?。
【解决方案2】:

在osascript 没有返回真正的错误代码的所有问题之后,我决定只检查文件是否被移动,如下所示:

# move file to trash on remote mac
ssh $login "bash -s" <<-EOF
  osascript -e "tell application \"Finder\" to move POSIX file \"$remote_filepath\" to trash" > /dev/null;
EOF
[[ ! -e "$remote_filepath" ]] || { printf "\nCannot move file to trash on remote mac" && exit 1; }

对我来说似乎更简单、更容易维护。谢谢大家的意见!

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    相关资源
    最近更新 更多