Est-ce que `sl` affiche le répertoire actuel?

106

Pour ceux qui ne sont pas au courant, il sls’agit d’un outil humoristique en ligne de commande conçu pour faire trébucher les utilisateurs s’ils se trompent ls. Lorsqu'il est appelé, il imprime une locomotive à vapeur. Par exemple:

                          (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O
                     (@@@)
                 (    )
              (@@@@)

            (   )
         ====        ________                ___________
     _D _|  |_______/        \__I_I_____===__|_________|
      |(_)---  |   H\________/ |   |        =|___ ___|      _________________
      /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
     |      |  |   H  |__--------------------| [___] |   =|                        |
     | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
     |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
   __/ =| o |=-O=====O=====O=====O \ ____Y___________|__|__________________________|_
    |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_|
     \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

Cependant, dans la page de manuel de sl, il indique le bogue suivant:

BUGS
        It rarely shows contents of current directory.

Ainsi, la question reste, y at - il des conditions, dans lesquelles en slfait ne montre le répertoire courant?

Braiam
la source
45
+1 pour m'avoir présenté un utilitaire très utile que je ne connaissais pas depuis des décennies.
devnull
3
@slm Nous avons affirmé cela, alors j'ai mis un bogue qui corrige ce problème critique: # 9
44
Il dit qu'il montre rarement le contenu du répertoire. Donc, je suppose qu'ils veulent dire que si vous avez des fichiers du type | | | H |__--------------------| [___] | =| |, sl les montre.
M. Lister
3
Demande de transfert
asteri
7
Je suis administrateur système Unix / Linux depuis 14 ans et je n’avais jamais entendu parler de cet outil incroyable. C'est incroyable combien il y a à apprendre.
Michael Martinez

Réponses:

183

Autant que je sache, la seule condition dans laquelle slvous affichez le répertoire actuel est lorsque vous le saisissez avec une erreur de frappe ls.

sfyn
la source
8
+1 Humoristique, mais j'espère une réponse plus autoritaire.
37
@LegoStormtroopr - peut-être attendez-vous que LegoEmperor intervienne?
mikeserv
42
  • Lemma: slimprime une locomotive à vapeur
  • Lemma: les noms de fichier valides ne peuvent pas contenir de barres obliques (bien que les chemins puissent l'être)
  • Lemma: La locomotive à vapeur contient des barres obliques:

    $ touch '                          (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O
    >                      (@@@)
    >                  (    )
    >               (@@@@)
    > 
    >             (   )
    >          ====        ________                ___________
    >      _D _|  |_______/        \__I_I_____===__|_________|
    >       |(_)---  |   H\________/ |   |        =|___ ___|      _________________
    >       /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
    >      |      |  |   H  |__--------------------| [___] |   =|                        |
    >      | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
    >      |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
    >    __/ =| o |=-O=====O=====O=====O \ ____Y___________|__|__________________________|_
    >     |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_|
    >      \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/'
    touch: cannot touch ‘[...]’: No such file or directory
    

Conclusion: slne montre jamais le répertoire en cours. CQFD

l0b0
la source
6
Il en contient plusieurs /, qui ne sont pas autorisés dans les noms de fichiers Unix.
mardi
2
Si tu le faisais mkdir -p "$(dirname "$(sl)")"tu pourrais le faire touch "$(sl)". Bien sûr, vous pouvez tester les limites de votre système d’exploitation. Et amusez-vous à nettoyer cela.
Kevin
3
@MrLister Cela ne serait sûrement possible que si le système de fichiers contenait également un bogue autorisant la création de tels fichiers. Avez-vous une référence?
l0b0
1
@VolkerSiegel: Pas vraiment. Windows prend en charge les deux /et \, et ils signifient la même chose.
Konrad Borowski
3
Si vous avez un fichier appelé H(par exemple), alors le slmontre bien. C'est juste que ça montre aussi beaucoup d'autres choses. :-)
ShreevatsaR
38

Voici un correctif pour résoudre ce bug :)

diff --git a/sl.c b/sl.c
index 2eeceb3..f2213ad 100644
--- a/sl.c
+++ b/sl.c
@@ -37,6 +37,7 @@
 #include <curses.h>
 #include <signal.h>
 #include <unistd.h>
+#include <stdlib.h>
 #include "sl.h"

 int ACCIDENT  = 0;
@@ -71,6 +72,13 @@ void option(char *str)
 int main(int argc, char *argv[])
 {
     int x, i;
+    
+    srand(time(NULL));
+    if(rand() % 100 < 10)
+    {
+       /* 10% chance of directory listing :) */
+       execv("/bin/ls", argv);
+    }

     for (i = 1; i < argc; ++i) {
    if (*argv[i] == '-') {
Ionoclaste Brigham
la source
5
Oh Seigneur. Vous êtes un érudit et un génie.
1
Tu sais, je n'ai aucune idée de comment faire ça? Je n'utilise pas moi-même github, sauf comme portail de téléchargement Web pour les logiciels d'autres personnes. Tu peux faire ça si tu veux. Je décline officiellement tout droit d'auteur sur le code ci-dessus et le place dans le domaine public.
Ionoclast Brigham
+1, mais ce n'est pas exactement 10% - rand() "Retourne un nombre entier pseudo-aléatoire compris entre 0 et RAND_MAX", qui dépend de la bibliothèque, mais peut ne pas être divisible par 100.
l0b0
1
Techniquement, les fonctions execx () peuvent être retournées. From man 3 exec: "Si l'une des fonctions exec () est renvoyée, une erreur s'est produite. La valeur de retour est -1 et la variable globale errno sera définie pour indiquer l'erreur."
Ionoclast Brigham
24

Vous pouvez vérifier le code source ici - https://github.com/mtoyoda/sl , hélas il n’ya pas d’autre option que celles documentées et malheureusement rien n’imprimera réellement les noms de fichiers.

Il semble donc que la réponse de @ sfyn est la bonne.

Graeme
la source
5
@LegoStormtroopr, en effet un problème critique.
Graeme
5
Peut-être le plus gros bug depuis Heartbleed!
12

Notez que la réponse de I0b0 est seulement une preuve qui sln'affichera jamais tout et seulement la liste de répertoires actuelle. Cependant, dans certaines circonstances, slla liste de répertoires actuelle sera affichée avec des "informations" supplémentaires.

Par exemple, dans un répertoire vide:

$ touch '                          (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O'
$ touch '                   (@@@)'
$ touch '                  (    )'
$ touch '              (@@@@)'
$ touch '            (   )'
$ sl

Dans les six premières lignes, le contenu du répertoire sera répertorié et, sur les 10 lignes restantes, il sera agrémenté d’une liste représentant un train (sans fumée).

JP
la source
3
Ou, le répertoire en cours peut être un ensemble vide. Dans ce cas, tous les fichiers (inexistants) sont affichés avec l'image d'un train. :-)
Kevin Seifert
6

Je sais que Lego Stormtroopr a enregistré un ticket afin que le problème critique puisse être résolu. Qui sait combien de temps il faudra pour qu'un correctif soit déployé?

En tant que tel, j'ai fourni une solution de contournement afin de minimiser l'impact dû au problème grave. Vous pouvez créer une fonction shell slqui exécuterait sl:

sl() {
  ((RANDOM%42)) && command sl || ls;
}

Invoquant maintenant, listera slsporadiquement le contenu du répertoire.

devnull
la source
2

Si vous le renommez ls, cela imprimera le répertoire courant. En fait, une fois que j'ai cessé de rire de la locomotive à vapeur, je l'ai ajouté à ma liste de pseudonymes.

notamment
la source
1

Vous pouvez toujours consulter le code source pour vous-même, et vous ne verriez jamais exécuter la lscommande ni afficher les répertoires.

https://github.com/mtoyoda/sl

La source est plutôt simple en fait. Même si vous n'êtes "pas un codeur", vous devriez quand même être capable de comprendre l'essentiel.

Je crois que le "bug" que vous avez posté ci-dessus est vraiment en plaisanterie (et de provoquer une discussion comme celle-ci lol)

SnakeDoc
la source
1

Oui, slagira comme si vous aviez configuré l'alias approprié dans bash ou le shell que vous utilisez!

J'ai en fait plusieurs alias pour ls dont

alias ls='ls -FG'
alias ll='ls -lFG'

alors merci pour la suggestion - je vais ajouter

alias sl='ls -FG'

(Non pas que je me souvienne de taper slmais ensuite j'ai tendance à nous llou lh!)

David MW Powers
la source
-1

Tu pourrais faire comme moi aussi ...

mv / usr / jeux / sl / usr / jeux / sl-OLD

mv / usr / jeux / LS / usr / jeux / LS-OLD

nano / usr / jeux / sl

Collez ce qui suit:

#! / bin / bash

echo "Vous avez tapé 'sl' au lieu de 'ls'!"

/ usr / games / sl-old

echo "Je suppose que je peux quand même le lister ..."

/ bin / ls

Appuyez sur CTRL + X pour quitter et sur Y pour enregistrer.

nano / usr / jeux / LS

Collez ce qui suit:

#! / bin / bash

echo "Vous avez tapé 'LS' au lieu de 'ls'!"

/ usr / games / sl-old

echo "Je suppose que je peux quand même le lister ..."

/ bin / ls

Appuyez sur CTRL + X pour quitter et sur Y pour enregistrer.

PS: Nous vous invitons à relancer ceci .. chercher dans "sl linux command" amène toujours ce fil, alors j’ai pensé donner une vraie réponse sur la façon dont je l’ai fait répertorier les fichiers ...

Thread_Reviver
la source