web-dev-qa-db-fra.com

La façon la plus élégante d'ajouter ppa via le script

J'écris un script bash qui ajoute automatiquement des PPA. Le problème est que si vous exécutez simplement la commande ppa add-apt-repository, vous obtiendrez un tas de lignes commentées en double dans chaque fichier de liste PPA dans le dossier /etc/apt/sources.list.d après avoir exécuté quelques fois le même script. fois.

Une solution à ce problème est de vérifiez avant de l'ajouter comme indiqué dans cette question/réponse.

Je suis un peu repoussé par le gros bloc de code dans cette réponse. Que se passe-t-il si nous les laissons être ajoutés en premier puis nettoyons les fichiers ensuite? Qui ressemblerait à ceci:

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 {}"

Y a-t-il des points négatifs avec l'approche ci-dessus? Des problèmes potentiellement dangereux?


Exemple d'apt-add-repository faisant ceci:

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
2
Simon The Cat

Ce n'est pas exactement Code Review mais c'est parti.

Ne pas analyser la sortie de ls!

ls /etc/apt/sources.list.d/*.list | xargs ...

Veuillez ne pas faire ça. Voir le lien dans le titre de la section pour une explication pourquoi et des alternatives possibles. La solution la plus simple et la plus élégante ici serait d'utiliser le globbing Shell pour générer les éléments à parcourir dans une boucle for:

for l in /etc/apt/sources.list.d/*.list; do
    uniq "$l" | Sudo tee "$l"
done

Transformer des fichiers sur place

Nous savons tous que la lecture d'un fichier avec un programme et la redirection de la sortie vers ce même fichier aboutissent probablement à un fichier vide. Lancer tee entre les deux aide un peu car il met en mémoire tampon l'entrée pendant un certain temps jusqu'à ce qu'il l'écrive dans sa sortie, mais c'est un détail d'implémentation qui peut échouer avec différentes implémentations tee et/ou différents noyaux. Il échoue également dès que la taille de la sortie dépasse la taille du tampon. Au lieu de cela, vous devez utiliser quelque chose comme

uniq "$l" | Sudo sponge "$l"

ou peut-être

Sudo sed -i ... "$l"

si vous pouvez trouver un script sed approprié pour faire le travail.

Les deux ont l'avantage supplémentaire de ne pas également écrire l'entrée dans la sortie standard, mais vous pouvez quand même supprimer cela avec >/dev/null.

uniq trouve-t-il vraiment des lignes source Apt en double?

En regardant sources.list(5) , les lignes source Apt peuvent contenir plusieurs "composants". Les fichiers sources suivants sont équivalents mais pas identiques:

  • ligne unique à plusieurs composants:

    deb http://de.archive.ubuntu.com/ubuntu/ trusty-security main restricted
    
  • plusieurs lignes à un seul composant:

    deb http://de.archive.ubuntu.com/ubuntu/ trusty-security main
    deb http://de.archive.ubuntu.com/ubuntu/ trusty-security restricted
    

Il devrait être évident que par conséquent uniq ne peut pas trouver toutes les lignes source Apt en double. Cependant, comme les référentiels sur ppa.launchpad.net Ne prennent pas en charge plusieurs composants, vous pouvez vous entendre si vous n'utilisez que des PPA de ce site. De plus, les doublons peuvent être répartis sur plusieurs fichiers, ce qui casse complètement cette approche, sauf si vous vous fiez au fait que add-apt-repository Gère les fichiers source de façon quelque peu intelligente et place exactement un PPA dans chaque fichier.

Bien qu'il soit possible d'écrire un programme Bash qui prend en compte les lignes multi-composants lors de la vérification des doublons, il serait préférable d'utiliser les bibliothèques de logiciels existantes pour analyser les lignes source Apt au lieu de lancer votre propre solution. Une de ces bibliothèques est le module aptsources de Python (emballé dans python-apt Ou python3-apt). Vous pouvez trouver un exemple de son utilisation dans apt-remove-duplicate-source-entries (provenant de la question Comment puis-je réparer automatiquement W: Target Packages… est configuré plusieurs fois? ).

1
David Foerster