如何根据 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。
我正在研究 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。