pipefail
não impede que o lado direito do pipeline seja executado, todo o tubo é executado simultaneamente, como de costume. Experimente, por exemplo
$ set -o pipefail
$ false | echo foo
foo
É o uso de xargs
que pode ou não impedir a execução de apt
aqui, se não receber entrada. Sem -r
ou -I
, ele ainda executaria o comando pelo menos uma vez.
Mas você poderia contornar isso capturando a saída com uma substituição de comando e executando apt
ou não, com base no resultado:
if packages=$(somecmd...) && [ "$packages" ] ; then
set -f
sudo apt install $packages
fi
Nomes de pacotes não devem ter espaços em branco, portanto, usar $packages
não-citado deve funcionar (assumindo o valor padrão $IFS
; eles provavelmente não podem conter caracteres glob, portanto set -f
pode ser desnecessário).