我正在开发一个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"
我认为这将适用于所有