`Sl` mostra mai la directory corrente?


106

Per chi è fuori dal giro, slè uno strumento da riga di comando umoristico che ha lo scopo di far inciampare le persone se digitano male ls. Quando viene invocato, stampa una locomotiva a vapore. Per esempio:

                          (  ) (@@) ( )  (@)  ()    @@    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_|
     \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

Tuttavia, nella pagina man di sl, indica il seguente bug:

BUGS
        It rarely shows contents of current directory.

Quindi, la domanda rimane, ci sono alcune condizioni, in base al quale slin realtà non mostrare la directory corrente?


45
+1 per avermi presentato un'utilità molto utile di cui non ero a conoscenza da decenni.
Devnull,

3
@slm Lo abbiamo verificato, quindi ho inserito un bug che risolve questo problema critico: # 9

44
Dice che mostra raramente il contenuto della directory. Quindi presumo significhino che se hai file come | | | H |__--------------------| [___] | =| |, sl li mostra.
Lister,

3
Pull Request inc: github.com/mtoyoda/sl/pull/11
asteri

7
Sono stato un amministratore di sistema Unix / Linux per 14 anni e non avevo mai sentito parlare di questo incredibile strumento. È incredibile quanto c'è da imparare.
Michael Martinez,

Risposte:


183

Per quanto ne so, l'unica condizione in cui viene slmostrata la directory corrente è quando si digita male come ls.


8
+1 Divertente, ma spero in una risposta più autorevole.

37
@LegoStormtroopr - forse stai aspettando il peso di LegoEmperor?
Mikeserv,

42
  • Lemma: slstampa una locomotiva a vapore
  • Lemma: i nomi di file validi non possono contenere barre (anche se i percorsi possono)
  • Lemma: la locomotiva a vapore contiene barre:

    $ 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
    

Conclusione: slnon mostra mai la directory corrente. QED.


6
Ne contiene diversi /, che non sono ammessi nei nomi di file Unix.
martedì

2
Se lo facessi, mkdir -p "$(dirname "$(sl)")"potresti farlo touch "$(sl)". Naturalmente, potresti provare i limiti del tuo OS / FS. E divertiti a pulirlo.
Kevin,

3
@MrLister Sicuramente ciò sarebbe possibile solo se nel filesystem fosse presente anche un bug per consentire la creazione di tali file. Hai un riferimento?
l0b0

1
@VolkerSiegel: Non proprio. Windows supporta entrambi /e \, e significano la stessa cosa.
Konrad Borowski,

3
Se hai un file chiamato H(per esempio), allora sllo mostra davvero. È solo che mostra anche molte altre cose. :-)
ShreevatsaR

38

Ecco una patch per correggere quel 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] == '-') {

5
Oh Signore. Signore, sei uno studioso e un genio.

3
Per favore ... per favore ... invia una richiesta pull per quella patch

1
Sai, in realtà non ho idea di come farlo? Non uso github da solo, tranne che come portale di download basato sul web per software di altre persone. Puoi farlo se vuoi. Declinerò ufficialmente tutti i diritti d'autore sul codice sopra e lo metto di dominio pubblico.
Ionoclast Brigham,

+1, ma non è esattamente il 10% - rand() "Restituisce un numero integrale pseudo-casuale nell'intervallo compreso tra 0 e RAND_MAX", che dipende dalla libreria ma potrebbe non essere divisibile per 100.
l0b0

1
Tecnicamente, le funzioni execx () possono tornare. Da man 3 exec: "Se viene restituita una delle funzioni exec (), si è verificato un errore. Il valore restituito è -1 e la variabile globale errno verrà impostata per indicare l'errore."
Ionoclast Brigham,


12

Nota che la risposta di I0b0 è solo una prova che slnon mostrerà mai tutto e solo l'elenco di directory corrente. Tuttavia, ci sono circostanze in cui slverrà visualizzato l'elenco della directory corrente insieme a ulteriori "informazioni".

Ad esempio, in una directory vuota:

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

sulle prime sei righe elencherà il contenuto della directory e sulle restanti 10 righe abbellirà convenientemente questo elenco con l'immagine di un treno (senza fumo).


3
In alternativa, la directory corrente potrebbe essere un set vuoto. Nel qual caso tutti i file (inesistenti) vengono visualizzati insieme a un'immagine di un treno. :-)
Kevin Seifert,

6

So che Lego Stormtroopr ha registrato un biglietto in modo che il problema critico possa essere risolto. Chi sa molto tempo potrebbe essere necessario per implementare una correzione?

Come tale, ho fornito una soluzione alternativa in modo da ridurre al minimo l'impatto dovuto alla grave questione. È possibile creare una funzione shell slche dovrebbe eseguire sl:

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

Ora invocando slelencherà, sporadicamente, il contenuto della directory.


2

Se lo fai alias ls, stamperà la directory corrente - infatti, una volta che ho smesso di ridere della locomotiva a motore a vapore, l'ho aggiunto al mio elenco di alias.


1

Puoi sempre rivedere il codice sorgente per te stesso e non vedresti mai eseguire il lscomando effettivo né visualizzare le directory in nessuna condizione .

https://github.com/mtoyoda/sl

La fonte è piuttosto semplice in realtà. Anche se non sei un "programmatore", dovresti comunque essere in grado di capirne la maggior parte.

Credo che il "bug" che hai postato sopra sia davvero solo per scherzo (e per provocare discussioni come questa lol)


1

Sì, slsi comporterà come ls se si imposta l'alias appropriato in bash o qualunque shell si stia usando!

In realtà ho diversi alias per ls incluso

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

quindi grazie per il suggerimento - aggiungerò

alias sl='ls -FG'

(Non che io abbia mai ricordato di aver scritto slma poi tendo a noi llo lh!)


-1

Potresti fare come faccio anche io ...

mv / usr / games / sl / usr / games / sl-OLD

mv / usr / games / LS / usr / games / LS-OLD

nano / usr / games / sl

Incolla quanto segue:

#! / Bin / bash

echo "Hai digitato 'sl' INSTEAD OF 'ls'!"

/ Usr / giochi / sl-old

echo "Suppongo di poterlo elencare comunque ..."

/ bin / ls

Premi CTRL + X per uscire e Y per salvare.

nano / usr / games / LS

Incolla quanto segue:

#! / Bin / bash

echo "Hai digitato 'LS' INSTEAD OF 'ls'!"

/ Usr / giochi / sl-old

echo "Suppongo di poterlo elencare comunque ..."

/ bin / ls

Premi CTRL + X per uscire e Y per salvare.

PS: Prego per aver rilanciato questo .. la ricerca di "sl linux command" riporta ancora questo thread, quindi ho pensato di dare una risposta reale su come l'ho fatto elencare i file ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.