如何根据 shell 中的命令退出状态更改输出?

How to change output depending upon command exit status in shell?

我正在研究 bash shell,在编写脚本时我想更改命令的输出和错误消息。

例如命令是

sudo apt install nano

我要给输出

Installing nano

命令成功完成后

Nano Installed

否则

Error occurred

在这样做的同时我尝试了这个

printf "\n Installing Nano"
{
  sudo apt install nano -y
} &> /dev/null
printf "\r Nano Installed \n"

但它不会显示不同退出状态的不同值

在尝试这样做的过程中,我找到了一个方法

printf "\n Installing Nano"
sudo apt install nano &> /dev/null &&
printf "\r Nano Installed\n" ||
printf "\r Error Occured\n"

我认为这对所有人都有效

我认为您混淆了两种不同的东西,成功与失败以及标准输出与标准错误。 stdout 与 stderr 的区别实际上与命令的“正常”输出 (stdout) 与状态消息(stderr,包括错误消息、成功消息、状态消息等)有关。在您的情况下,所有 您正在打印的内容应该转到 stderr,而不是 stdout。

成功与失败是另外一个问题,通常通过命令的退出状态来检测。有点strange-looking,但是检查命令退出状态的标准方法是将它用作if语句的条件,像这样:

printf "\n Installing Nano" >&2
if sudo apt install nano -y &> /dev/null; then
    # The "then" branch runs if the condition succeeds
    printf "\r Nano Installed \n" >&2
else
    # The "else" branch runs if the condition fails
    printf "\r Error Occured  \n" >&2
fi

(使用 &&|| 而不是 if ... then ... else 在某些情况下会导致混乱和奇怪的问题;我不推荐它。)

注意:>&2 将输出重定向到 stderr,因此上面将 所有 消息发送到 stderr。