O 'sl' já mostra o diretório atual?

103

Para aqueles que estão fora do loop, sl é uma ferramenta de linha de comando que serve para enganar as pessoas se digitarem incorretamente ls . Quando invocado, imprime uma locomotiva a vapor. Por exemplo:

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

No entanto, na página man de sl , ele informa o seguinte bug:

BUGS
        It rarely shows contents of current directory.

Então, a questão permanece: existem algumas condições, sob as quais sl faz mostrar o diretório atual?

    
por Braiam 15.04.2014 / 03:40

10 respostas

177

Até onde eu sei, a única condição sob a qual sl mostra o diretório atual é quando você digita como ls .

    
por 15.04.2014 / 03:45
40
  • Lemma: sl imprime uma locomotiva a vapor
  • Lemma: Nomes de arquivos válidos não podem conter barras (embora caminhos possam)
  • Lemma: A locomotiva a vapor contém barras:

    $ 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
    

Conclusão: sl nunca mostra o diretório atual. QED.

    
por 15.04.2014 / 14:37
38

Aqui está um patch para corrigir esse 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] == '-') {
    
por 16.04.2014 / 04:55
24

Você pode verificar o código fonte aqui - link , infelizmente não há outras opções além das documentadas e infelizmente nada que vai realmente imprimir os nomes dos arquivos.

Portanto, parece que a resposta do @ sfyn é a correta.

    
por 15.04.2014 / 03:48
12

Observe que a resposta do I0b0 é apenas uma prova de que sl nunca exibirá todos e somente a listagem atual do diretório. No entanto, há circunstâncias em que sl exibirá a listagem do diretório atual junto com informações adicionais.

Por exemplo, em um diretório vazio:

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

nas primeiras seis linhas listará o conteúdo do diretório e nas 10 linhas restantes embelezará convenientemente esta listagem com uma imagem de um trem (sem fumaça).

    
por 17.04.2014 / 16:50
6

Eu sei que Lego Stormtroopr tem registrou um ticket para que o problema crítico possa ser resolvido. Quem sabe muito tempo que pode levar para uma correção ser implementada?

Como tal, forneci uma solução alternativa para que o impacto devido ao problema grave seja minimizado. Você pode criar uma função de shell sl que executaria sl :

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

Agora, invocar sl , esporadicamente, listará o conteúdo do diretório.

    
por 16.04.2014 / 15:27
2

Se você apelidá-lo de ls , ele irá imprimir o diretório atual - na verdade, quando parei de rir da locomotiva a vapor, adicionei isso à minha lista de apelidos.

    
por 17.04.2014 / 14:10
1

Você pode sempre revisar seu código-fonte, e você não verá sob nenhuma condição que ele nunca executará o comando ls real nem os diretórios de exibição.

link

A fonte é bastante simples, na verdade. Mesmo se você não for "um programador", ainda assim será capaz de entender a maior parte dele.

Eu acredito que o "bug" que você postou acima é apenas uma brincadeira (e causar discussões como essa lol)

    
por 19.04.2014 / 19:58
1

Sim, sl agirá exatamente como ls se você configurar o alias apropriado no bash ou em qualquer shell que estiver usando!

Na verdade, tenho vários alias para ls incluindo

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

obrigado pela sugestão - vou adicionar

alias sl='ls -FG'

(Não que eu tenha me lembrado de digitar sl , mas depois eu cuido de ll ou lh !)

    
por 16.04.2014 / 10:03
-1

Você pode fazer como eu também ...

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

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

nano /usr/games/sl

Paste the following:

#!/bin/bash

echo "YOU TYPED 'sl' INSTEAD OF 'ls'!"

/usr/games/sl-old

echo "Guess I can list it anyways..."

/bin/ls

    
         

Pressione CTRL + X para sair e Y para salvar.

         

nano / usr / games / LS

         

Paste the following:

#!/bin/bash

echo "YOU TYPED 'LS' INSTEAD OF 'ls'!"

/usr/games/sl-old

echo "Guess I can list it anyways..."

/bin/ls

    
         

Pressione CTRL + X para sair e Y para salvar.

  

PS: Você é bem-vindo para reviver isso ... pesquisar por "comando sl linux" ainda traz esse tópico, então eu pensei em dar uma resposta real de como eu listei os arquivos ...

    
por 22.08.2018 / 14:12

Tags