Debian 9 /.bashrc变量显示找不到文件而不是被忽略

时间:2018-07-18 18:08:44

标签: bash debian

我有以下小的脚本,该脚本将告诉我哪些包需要服务器重新启动。我想把它放在〜/ .bashrc中,这样我登录时就可以看到它。

#shows which packages require the server to be rebooted
package=$(cat /var/run/reboot-required.pkgs)
if [ ! -f /var/run/reboot-required ]
then
echo "No packages require reboot. Have a nice day :)"
else
echo "*** Hello $USER, you must reboot your machine because of the following 
package(s): $package ***"
echo
fi

但是,当我登录时,由于该服务器目前没有任何需要重启服务器的软件包,因此我看到了这样的消息:

cat: /var/run/reboot-required.pkgs: No such file or directory
No packages require reboot. Have a nice day :)    

如何仅显示消息说明没有需要重启的软件包?除了这个小问题之外,其他所有工具都可以正常工作。它确实向我显示了需要重新启动的文件。

服务器是Debian 9。

先谢谢了。

2 个答案:

答案 0 :(得分:1)

感谢@Cyrus对我的帮助。我尝试了他的建议,将变量移到我的else语句中,这一点行得通。

之前的代码:

#shows which packages require the server to be rebooted
package=$(cat /var/run/reboot-required.pkgs)
if [ ! -f /var/run/reboot-required ]
then
echo "No packages require reboot. Have a nice day :)"
else
echo "*** Hello $USER, you must reboot your machine because of the following 
package(s): $package ***"
echo
fi

在Cyrus的建议生效后的代码:

#shows which packages require the server to be rebooted
echo
if [ ! -f /var/run/reboot-required ]
then
echo "No packages require reboot. Have a nice day :)"
else
package=$(cat /var/run/reboot-required.pkgs)
echo "[*** Hello $USER, your must reboot your machine because of the following 
package(s): $package ***]"
echo
fi

答案 1 :(得分:1)

“没有这样的文件或目录”是来自cat命令的错误消息。只需重定向stderr:

package=$(cat /var/run/reboot-required.pkgs 2>/dev/null)

或者,对赛勒斯评论中的建议进行一些细微的改动,在阅读之前先测试其是否存在:

if [ -e /var/run/reboot-required.pkgs ] ; then
    package=$(cat /var/run/reboot-required.pkgs 2>/dev/null)
    ...
else
    ...
fi

但是,如果在运行此代码的同时碰巧删除了文件,则可能会出现竞争状况的风险。

您似乎假设/var/run/reboot-required存在,并且只有/var/run/reboot-required.pkgs存在。这可能是正确的,但至少要知道这是一个假设。