您可以使用tee
to 复制pacman
的标准输出并将其中一个副本重定向到当前进程的控制 tty;在 Linux 上,它可以作为/dev/tty
:
sudo pacman -Syu --noconfirm |
tee /dev/tty |
if grep -q 'non ci sono aggiornamenti'; then
notify-send -i /usr/share/icons/arch.png "Nothing ..."
else
notify-send -i /usr/share/icons/arch.png "Packages upgraded"
fi
或者,您可以使用checkupdates
from pacman-contrib。它的退出状态是2
没有可用更新时:
checkupdates 1>/dev/null
if test "$?" -eq 2; then
message="Nothing to upgrade or there was an error"
else
sudo pacman -Syu --noconfirm
message="Packages upgraded"
fi
notify-send -i /usr/share/icons/arch.png -- "$message"
请注意,在您的函数和我的第一个代码片段中,始终if
执行一个分支(或 AND/OR 列表中的一个命令) ,当以错误终止时会给您一个误导性通知。
还要考虑到这一点,您需要将' 输出的副本发送到临时文件,因为您无法捕获' 的退出状态并在同一管道中使用 ( ) 其输出:pacman
pacman
pacman
grep
psyu () (
set -o pipefail
trap 'rm -rf -- "$tmpdir"' EXIT
tmpdir=$(mktemp -d)
tmpfile="$tmpdir/pacman.out"
if ! sudo pacman -Syu --noconfirm |
tee -- "$tmpfile"
then
message="pacman: Some error occurred"
elif grep -q -- 'non ci sono aggiornamenti' "$tmpfile"; then
message="Nothing to upgrade"
else
message="Packages upgraded"
fi
notify-send -i /usr/share/icons/arch.png -- "$message"
)
pipefail
需要 shell 选项以允许测试也捕获管道第一阶段中发生的if
错误(否则它的退出状态将是最后一个命令的退出状态)。
最后,请注意函数定义在括号()
中,以避免在调用 shell 中设置陷阱和选项。