URL: https://linuxfr.org/users/raphj/journaux/lns-ln-s-pour-les-etourdis Title: lns: ln -s pour les étourdis Authors: raphj Date: 2015年04月16日T11:21:50+02:00 License: CC By-SA Tags: shell, bash, wtfpl, ln, lns et astuce Score: 21 Bonjour à toutes et à tous, encore un journal ennuyeux, alors lisez vraiment si vous n'avez que ça à faire, ou si vous avez une montagne de choses à faire mais que vous avez quand même du temps à perdre. Une question pour commencer. Fermez vos terminaux, rangez vos documents. Vous, là-bas, éteignez votre téléphone s'il vous plaît. _Ne trichez pas !_ Bien. Quelle est la bonne commande pour créer un lien symbolique de nom $lien qui pointe vers $cible ? (plusieurs réponses possibles, sauf 1 et 2 qui ne peuvent pas être choisies en même temps bien sûr) 1. ``ln -s $lien $cible`` 2. ``ln -s $cible $lien`` 3. J'écris mes liens symboliques avec ``dd`` 4. C'est quoi un lien symbolique ? 5. C'est quoi une commande ? Si vous avez répondu 1 sans hésitation (ou avec, en fait, ou si vous avez répondu 2 sans en être sûr-e), alors il se peut que la suite vous apporte tout le bonheur du monde si vous avez _parfois_ besoin de créer un lien symbolique. Dans les autres cas, en particulier si vous avez répondu 2, 4 ou 5 sans hésiter, ce qui suit ne vous concerne pas. Celles et ceux qui ont répondu 3 sont prié-e-s de ne pas faire les pitres pendant le journal, ils/elles discuteront à la fin. Merci d'avance. Une commande ``ln -s`` chez moi est souvent suivie d'un ``rm``, puis d'un autre ``ln -s`` tout à fait similaire au premier, mais avec les paramètres inversés. La dernière fois, c'était il y a 10 minutes. Ça ne voudra pas rentrer dans ma tête. Alors ci-après une petite fonction _shell_ à mettre dans votre ``~/.bash_aliases`` ou dans votre ``~/.bashrc`` (ou tout autre ``~/.trucrc``) qui a le même effet, mais qui ne nécessite qu'une seule commande et qui ne demande pas de réflexion sur l'ordre des paramètres : ```bash lns() { # lns: ln -s for absent-minded people, English edition # Under the WTFPL license if [ "$#" -ne 2 ]; then echo 'lns expects two parameters: the name of the link, and the pointed object, in any order.' echo 'lns calls ln -s $target $linkname.' echo 'The pointed object must exist, and should be an absolute path, unless you know what you are doing.' else if [ -e "1ドル" ]; then target=1ドル linkName=2ドル elif [ -e "2ドル" ]; then target=2ドル linkName=1ドル else echo "None of the parameters reference an existing object." return fi ln -s "$target" "$linkName" fi } ``` La même fonction, mais qui parle en français, parce qu'il ne faut pas déconner, ici on est dans un domaine francophone : ```bash lns() { # lns: ln -s pour les étourdis, édition française # Sous licence LPRAB if [ "$#" -ne 2 ]; then echo 'lns attend deux paramètres : le nom du lien $nomLien et l’objet ciblé $objectCible, dans n’importe quel ordre.' echo 'lns appelle ln -s $objectCible $nomLien.' echo 'L’objet ciblé doit exister et doit être un chemin absolu, sauf si vous savez ce que vous faites.' else if [ -e "1ドル" ]; then cible=1ドル nomLien=2ドル elif [ -e "2ドル" ]; then cible=2ドル nomLien=1ドル else echo 'Aucun des arguments ne fait référence à un objet qui existe.' return fi ln -s "$cible" "$nomLien" fi } ``` C'est loin d'être nouveau et je n'ai pas inventé l'eau chaude, mais ça peut servir. Allez, pour vous, un exemple d'utilisation simple : ``` /tmp/testslns $ touch existing # on crée un fichier vers lequel on va créer un lien /tmp/testslns $ rm -rf link # on s'assure que le lien qu'on va créer n'existe pas /tmp/testslns $ lns /tmp/testslns/existing link /tmp/testslns $ ls -l total 0 -rw-rw-r-- 1 raph raph 0 avril 16 10:43 existing lrwxrwxrwx 1 raph raph 8 avril 16 10:44 link -> existing ``` L'exemple symétrique (puisque toute la subtilité de ``lns`` réside là dedans !) : ``` /tmp/testslns $ touch existing # on crée un fichier vers lequel on va créer un lien /tmp/testslns $ rm -rf link # on s'assure que le lien qu'on va créer n'existe pas /tmp/testslns $ lns link /tmp/testslns/existing /tmp/testslns $ ls -l total 0 -rw-rw-r-- 1 raph raph 0 avril 16 10:44 existing lrwxrwxrwx 1 raph raph 8 avril 16 10:45 link -> existing ``` Il ne reste plus qu'à _ne pas oublier_ d'utiliser ``lns`` à la place de ``ln -s``... Si ça ne fonctionne pas pour vous, vous n'avez qu'à [apprendre à vous servir de la ligne de commande sur OpenClassrooms](http://openclassrooms.com/courses/reprenez-le-controle-a-l-aide-de-linux/introduction-aux-scripts-shell), ce n'est pas bien compliqué. À plus !