¿`Sl` muestra alguna vez el directorio actual?

106

Para aquellos fuera del circuito, sles una herramienta de línea de comandos chistosa que está destinada a hacer tropezar a las personas si escriben mal ls. Cuando se invoca, imprime una locomotora a vapor. Por ejemplo:

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

Sin embargo, en la página de manual de sl, se indica el siguiente error:

BUGS
        It rarely shows contents of current directory.

Entonces, la pregunta sigue siendo, ¿hay algunas condiciones, bajo las cuales slrealmente se muestra el directorio actual?

Braiam
fuente
45
+1 por presentarme una utilidad muy útil de la que no había estado al tanto durante décadas.
devnull
3
@slm Hemos afirmado eso, así que he puesto un error que soluciona este problema crítico: # 9
44
Dice que rara vez muestra el contenido del directorio. Así que supongo que significan que si tiene archivos como | | | H |__--------------------| [___] | =| |, sl los muestra.
Sr. Lister el
3
Pull Request inc: github.com/mtoyoda/sl/pull/11
asteri
77
He sido un administrador de sistemas Unix / Linux durante 14 años y nunca había oído hablar de esta increíble herramienta. Es sorprendente lo mucho que hay que aprender.
Michael Martinez

Respuestas:

183

Hasta donde sé, la única condición bajo la cual se slmuestra el directorio actual es cuando lo escribes mal como ls.

sfyn
fuente
8
+1 Humorístico, pero espero una respuesta más autorizada.
37
@LegoStormtroopr: ¿tal vez estás esperando que LegoEmperor pese?
mikeserv
42
  • Lema: slimprime una locomotora de vapor
  • Lema: los nombres de archivo válidos no pueden contener barras diagonales (aunque las rutas sí pueden)
  • Lema: La locomotora de vapor contiene barras diagonales:

    $ 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
    

Conclusión: slnunca muestra el directorio actual. QED

l0b0
fuente
66
Contiene varios /'es, que no están permitidos en los nombres de archivo Unix.
mtak
2
Si mkdir -p "$(dirname "$(sl)")"hicieras un , podrías hacerlo touch "$(sl)". Por supuesto, puede estar probando los límites de su OS / FS. Y diviértete limpiando eso.
Kevin
3
@MrLister Seguramente eso solo sería posible si el sistema de archivos también tuviera un error para permitir la creación de dichos archivos. Tiene una referencia?
l0b0
1
@VolkerSiegel: En realidad no. Windows admite ambos /y \significan lo mismo.
Konrad Borowski
3
Si tiene un archivo llamado H(por ejemplo), slsí lo muestra. Es solo que también muestra muchas otras cosas. :-)
ShreevatsaR
38

Aquí hay un parche para corregir ese error :)

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] == '-') {
Ionoclast Brigham
fuente
55
Oh Señor. Usted señor es un erudito y un genio.
1
¿Sabes, en realidad no tengo idea de cómo hacer eso? Yo no uso github, excepto como un portal de descarga basado en la web para el software de otras personas. Puedes hacerlo si quieres. Renuncio oficialmente a todos los derechos de autor sobre el código anterior y lo coloco en el dominio público.
Ionoclast Brigham
+1, pero eso no es exactamente el 10% - rand() "Devuelve un número integral pseudoaleatorio en el rango entre 0 y RAND_MAX", que depende de la biblioteca pero puede no ser divisible por 100.
l0b0
1
Técnicamente, las funciones execx () pueden regresar. De man 3 exec: "Si alguna de las funciones exec () regresa, se habrá producido un error. El valor de retorno es -1 y la variable global errno se establecerá para indicar el error".
Ionoclast Brigham
24

Puede consultar el código fuente aquí: https://github.com/mtoyoda/sl , lamentablemente no hay otras opciones que no sean las documentadas y lamentablemente nada que realmente imprima los nombres de los archivos.

Entonces parece que la respuesta de @ sfyn es la correcta.

Graeme
fuente
55
@LegoStormtroopr, de hecho, un problema crítico.
Graeme
55
¡Posiblemente el error más grande desde Heartbleed!
12

Tenga en cuenta que la respuesta de I0b0 es solo una prueba que slnunca mostrará todos y solo la lista actual del directorio. Sin embargo, hay circunstancias en las que slse mostrará la lista del directorio actual junto con 'información' adicional.

Por ejemplo, en un directorio vacío:

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

en las primeras seis líneas enumerará el contenido del directorio, y en las 10 líneas restantes embellecerá convenientemente este listado con una imagen de un tren (sin humo).

JP
fuente
3
O bien, el directorio actual podría ser un conjunto vacío. En cuyo caso, todos los archivos (inexistentes) se muestran junto con una imagen de un tren. :-)
Kevin Seifert
6

Sé que Lego Stormtroopr ha registrado un ticket para que se pueda abordar el problema crítico. ¿Quién sabe cuánto tiempo puede llevar una solución?

Como tal, he proporcionado una solución alternativa para minimizar el impacto debido al grave problema. Puede crear una función de shell slque ejecute sl:

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

Ahora invocando sl, esporádicamente, se enumerará el contenido del directorio.

devnull
fuente
2

Si lo alias ls, imprimirá el directorio actual; de hecho, una vez que dejé de reírme de la locomotora de la máquina de vapor, lo agregué a mi lista de alias.

notablemente
fuente
1

Siempre puede revisar su código fuente por sí mismo, y vería que bajo ninguna condición realiza el lscomando real ni muestra directorios.

https://github.com/mtoyoda/sl

La fuente es bastante simple en realidad. Incluso si "no es un programador", aún debería ser capaz de comprender la mayor parte.

Creo que el "error" que publicaste anteriormente es solo una broma (y para provocar una discusión como esta jajaja)

SnakeDoc
fuente
1

¡Sí, slactuará como ls si configura el alias apropiado en bash o cualquier shell que esté usando!

De hecho, tengo varios alias para ls, incluidos

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

así que gracias por la sugerencia, agregaré

alias sl='ls -FG'

(¡No es que recuerde haber escrito alguna vez, slpero luego tiendo a nosotros llo lh!)

David MW Powers
fuente
-1

Podrías hacer como yo también ...

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

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

nano / usr / games / sl

Pegue lo siguiente:

#! / bin / bash

echo "TIPASTE 'sl' EN LUGAR DE 'ls'!"

/ usr / games / sl-old

echo "Supongo que puedo enumerarlo de todos modos ..."

/ bin / ls

Presione CTRL + X para salir e Y para guardar.

nano / usr / juegos / LS

Pegue lo siguiente:

#! / bin / bash

echo "TIPASTE 'LS' EN LUGAR DE 'ls'!"

/ usr / games / sl-old

echo "Supongo que puedo enumerarlo de todos modos ..."

/ bin / ls

Presione CTRL + X para salir e Y para guardar.

PD: De nada por revivir esto ... la búsqueda de "comando sl linux" todavía trae este hilo, así que pensé que daría una respuesta real sobre cómo hice que enumerara los archivos ...

Thread_Reviver
fuente