Isso não é exatamente Revisão de código , mas aqui vamos nós.
Não analise a saída de ls
!
ls /etc/apt/sources.list.d/*.list | xargs ...
Por favor, não faça isso. Veja o link no título da seção para uma explicação sobre por que e possíveis alternativas. A solução mais fácil e elegante aqui seria usar o shell globbing para gerar os itens para iterar em um loop:
for l in /etc/apt/sources.list.d/*.list; do
uniq "$l" | sudo tee "$l"
done
Transformando arquivos no local
Todos nós sabemos que ler um arquivo com um programa e redirecionar a saída de volta para o mesmo arquivo provavelmente resulta em um arquivo vazio. Lançar tee
entre ajuda um pouco porque armazena em buffer a entrada por um tempo até gravar em sua saída, mas esse é um detalhe de implementação que pode falhar com diferentes tee
implementações e / ou diferentes kernels. Ele também falha assim que o tamanho da saída excede o tamanho do buffer. Em vez disso, você deve usar algo como
uniq "$l" | sudo sponge "$l"
ou possivelmente
sudo sed -i ... "$l"
se você puder encontrar um script sed apropriado para fazer o trabalho.
Ambos têm o benefício adicional de não escreverem a entrada para a saída padrão, mas você pode suprimir isso com >/dev/null
de qualquer maneira.
O uniq
realmente encontra linhas de código duplicadas do Apt?
Olhando para sources.list(5)
, as linhas de código-fonte do Apt podem conter vários “componentes”. Os seguintes arquivos de origem são equivalentes, mas não idênticos:
-
linha única de vários componentes:
deb http://de.archive.ubuntu.com/ubuntu/ trusty-security main restricted
-
várias linhas de componente único:
deb http://de.archive.ubuntu.com/ubuntu/ trusty-security main deb http://de.archive.ubuntu.com/ubuntu/ trusty-security restricted
Deve ser óbvio que, portanto, uniq
não pode encontrar todas as linhas de origem duplicadas do Apt. No entanto, como os repositórios em ppa.launchpad.net
não suportam vários componentes, você pode se dar bem se usar somente PPAs desse site. Além disso, as duplicatas podem ser distribuídas em vários arquivos, o que quebra totalmente essa abordagem, a menos que você dependa do fato de que add-apt-repository
gerencia os arquivos de origem de maneira inteligente e coloca exatamente um PPA em cada arquivo.
Embora seja possível escrever um programa Bash que leve em consideração as linhas de múltiplos componentes ao verificar duplicatas, seria melhor usar as bibliotecas de software existentes para analisar as linhas de origem do Apt em vez de rolar sua própria solução. Uma dessas bibliotecas é o módulo aptsources
do Python (empacotado em python-apt
ou python3-apt
). Você pode encontrar um exemplo de seu uso em apt-remove-duplicate-source-entries da pergunta Como posso consertar automaticamente o W: Pacotes de destino… está configurado várias vezes? ).