Вы можете использовать tee
, чтобы продублировать стандартный вывод 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
из 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
(или одна из команд в Ваш И / ИЛИ список) всегда выполняется, давая вам вводящее в заблуждение уведомление, когда 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"
)
* 1027 Опция * shell необходима, чтобы позволить тесту if
также отлавливать ошибки, возникающие на первом этапе конвейера (в противном случае его состояние выхода будет равно состоянию последней команды).
Наконец, обратите внимание, что определение функции находится в Скобки ()
во избежание установки ловушек и параметров в вызывающей оболочке.