我正在尝试编写自动更新和升级脚本。
我想利用命令执行的退出状态,
但即使 apt-get update 命令失败,它也会返回退出状态 0。
所以我的脚本无法达到目的。
问题============
为什么 apt-get update 返回 0,我想在命令失败时获取其他数字而不是 0?
为了使我的脚本达到目的,我该如何修改它?
======================
感谢您的阅读!
这是我脚本的更新部分;
#!/bin/bash -x
### Variables
count=
command_result=""
### Main
echo "$(LC_TIME=en_US.UTF-8 date)" >> log_update
until [ "$count" = "10" ] || [ "$command_result" = "done" ]; do
sudo apt-get update
if [ "$?" = "0" ]; then
echo "Update succeeds." >> ~/log_update
command_result="done"
fi
count=$((count + 1))
done
if [ "$command" != "done" ]; then
echo "Time Out: Update FAILED! Solve Problem." >> log_update
fi
要理解为什么
apt
还是apt-get
返回0,即使遇到错误,首先要知道这些命令也是某个程序员开发的程序。因此返回到终端的值也由程序的开发者决定。我看到
apt
不起作用的唯一情况是在sudo
没有超级用户权限的情况下执行 apt 以下是在没有超级用户权限的情况下执行 apt 的片段:
如您所见,退出代码不是 0。因此我们可以得出结论,命令或程序没有被执行。
让我们看另一种情况,当没有互联网连接时:
如您所见,即使我们遇到错误,退出代码也是 0。原因是程序或命令确实执行成功。但是,它无法更新软件包列表以升级需要升级的软件包。
对此唯一的解释是,
apt
command 的开发者没有将更新包列表失败视为错误来停止命令本身并返回错误退出状态码。相反,该命令在执行后提供警告。为了更好地理解,我将举一个 C 程序的例子:
输出:
如您所见,有两种不同的退出状态代码,因为作为一名程序员,我认为不带参数执行的命令是错误的,应该以退出代码“1”终止。(我可以选择任何值)。如果命令成功执行,我返回“0”作为退出状态码,表示没有遇到错误。
让我们再举一个例子:
输出:
同样的程序,但这次程序员(即我)没有考虑用不同的退出状态代码终止程序。因此,即使终端打印错误输出,退出状态代码也是“0”。
结论
根据情况返回哪个值(即退出状态码)取决于程序的开发人员。我希望这可以清除退出状态代码的概念。
对您的 bash 脚本的建议
我看到你正在使用一个循环,
apt update
如果它没有成功执行,它将尝试执行 10 次命令。老实说,如果它第一次不起作用,那么接下来的 9 次也不会起作用。因此,创建一个循环是毫无意义的。现在,如果您想检查错误,请使用嵌套的 if-else 条件。您可以检查第一级的状态代码并检查
apt
第二级执行的错误(即退出代码“0”),您可以使用以下内容:如果
grep
能够获取一行,则将其作为错误存储在您的日志文件中,否则更新成功。