Eu configurei um pipe retornando o nome de um pacote que gostaria de instalar usando apt-get
:
... | xargs -I _ sudo apt install _
No entanto, apt-get
não é possível ler do stdin neste caso e sai com:
Você quer continuar? [S/n] Abortar.
Eu sei sobre o -y
sinalizador para instalar o pacote sem confirmação do usuário, mas gostaria de ver a confirmação.
Existe uma maneira de encaminhar o nome do pacote apt-get
enquanto ainda permite a leitura do stdin?
Colocar apt-get
no lado esquerdo de todo o comando não é uma opção, pois não quero apt-get
ser executado se um comando anterior no pipe for abortado, usando a set -o pipefail
opção.
Com a implementação GNU de
xargs
(normalmente encontrada em sistemas que também possuem umapt
comando) e um shell como ksh93/zsh/bash com suporte para substituição de processo, você pode fazer:ao invés de:
Observe que provavelmente faria mais sentido passar todos os pacotes de uma vez, em
apt
vez de chamar umapt
por pacote.(
-d
sendo outra extensão GNU)Em qualquer caso, como na versão do pipeline, com ou sem
pipefail
, que será executadosudo
independentemente de sercmd
bem-sucedido ou não, desde quesudo
sejamcmd
iniciados ao mesmo tempo e executados simultaneamente.pipefail
não impede o fluxo do lado direito do pipeline, todo o tubo funciona simultaneamente, como de costume. Tente por exemploÉ o uso
xargs
disso que pode ou não impedir a execuçãoapt
aqui, se não receber nenhuma entrada. Sem-r
ou-I
ainda executaria o comando pelo menos uma vez.Mas você pode contornar isso capturando a saída com uma substituição de comando e, em seguida, executando
apt
ou não, com base no resultado:Os nomes dos pacotes não devem ter nenhum espaço em branco, portanto, usar sem
$packages
aspas deve funcionar (assumindo o valor padrão de$IFS
; eles provavelmente também não podem conter caracteres glob, portanto,set -f
podem ser desnecessários).