Eu fiz mais coisas sobre o problema (e aprendi muito mais sobre sed ao longo do caminho). Eu não estou convencido de que este é o melhor caminho, mas é um caminho. Se alguém tiver uma maneira melhor de fazer isso, por favor responda, e eu ficarei feliz em responder.
sudo apt-get upgrade -s | sed -n '/back:/,/upgraded./p' | sed '1d;$d'
A opção -s
de apt-get upgrade
indica uma execução a seco em vez de uma instalação real. Eu canalizo o texto de saída dry-run para sed, onde a mágica acontece. No sed, -n
torna isso silencioso, então apenas o que eu digo para imprimir realmente é impresso. O o que imprimir é definido por um regex inicial e final. Iniciar com uma linha correspondente a "back:" e fim com uma linha correspondente a "upgraded". A sintaxe do sed foi complicada no início ... linuxcommando < ajudou-me a escolher a gama básica de linhas. Esse último p
está dizendo sed "ok ... imprima agora".
A saída do primeiro sed é algo como:
Os seguintes pacotes foram mantidos:
thing1 thing2 newthing3
42 atualizados, 7 recém-instalados 1 para remover e 3 não atualizados.
Eu canso que para outro, mais simples sed que cai as primeiras e últimas linhas ( 1d;$d
). Note, existem maneiras de fazer magia de deslocamento de linha no primeiro sed, mas eu senti que isso fez o single sed muito confuso. Eu estou bem usando um segundo sed, que deixa apenas:
thing1 thing2 newthing3
E esses são os pacotes mantidos para instalação manual.
kept_back_packages=$(sudo apt-get upgrade -s | sed -n '/back:/,/upgraded./p' | sed '1d;$d')
sudo apt-get install $kept_back_packages -y
(o -y
é apenas um suposto yes para o apt-get com script).
Nota:
quando não há pacotes retidos, isso trata tudo graciosamente e não faz nada. Uma string vazia é passada para o apt-get install, e tudo bem.