A maneira mais elegante de adicionar o ppa através do script [closed]

2

Estou escrevendo um script que adiciona PPAs automaticamente. O problema é que se você simplesmente executar o comando add-apt-repository ppa, você obterá um monte de linhas comentadas duplicadas em cada arquivo de lista PPA na pasta /etc/apt/sources.list.d depois de executar o mesmo script alguns vezes.

Uma solução para este problema é verificar antes de adicioná-lo, conforme descrito neste pergunta / resposta.

Estou um pouco repelido pelo grande bloco de código nessa resposta. E se deixarmos que eles sejam adicionados primeiro e depois limpar os arquivos depois? Qual ficaria assim:

sudo apt-add-repository -y ppa:rael-gc/rvm

# remove the duplicate ppa in the files
ls /etc/apt/sources.list.d/*.list |  xargs -n 1 -I {} sh -c "uniq {} | sudo tee {}"

Existem negativos com a abordagem acima? Algum problema possivelmente perigoso?

Exemplo de apt-add-repository fazendo isso:

cat /etc/apt/sources.list.d/rael-gc-ubuntu-rvm-xenial.list
deb http://ppa.launchpad.net/rael-gc/rvm/ubuntu xenial main
# deb-src http://ppa.launchpad.net/rael-gc/rvm/ubuntu xenial main

sudo apt-add-repository -y ppa:rael-gc/rvm

cat /etc/apt/sources.list.d/rael-gc-ubuntu-rvm-xenial.list
deb http://ppa.launchpad.net/rael-gc/rvm/ubuntu xenial main
# deb-src http://ppa.launchpad.net/rael-gc/rvm/ubuntu xenial main
# deb-src http://ppa.launchpad.net/rael-gc/rvm/ubuntu xenial main
    
por Simon The Cat 06.08.2016 / 20:11

1 resposta

1

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? ).

    
por David Foerster 07.08.2016 / 11:12