如何根据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"

但对于不同的退出状态,它没有显示不同的值

我认为您混淆了两件不同的事情,成功与失败以及stdout与stderr。stdout与stderr的区别实际上与命令的";正常的";输出(stdout(与状态消息(stderr,包括错误消息、成功消息、状态消息等(。在您的情况下,您正在打印的所有内容都应该进入stderr,而不是stdout。

成功与失败是一个不同的问题,通常通过命令的退出状态来检测。这看起来有点奇怪,但检查命令退出状态的标准方法是将其用作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。

在尝试这样做的同时,我找到了一种方法

printf "n Installing Nano"
sudo apt install nano &> /dev/null &&
printf "r Nano Installedn" ||
printf "r Error Occuredn"

我认为这将适用于所有

最新更新