O `sl` mostra o diretório atual?


106

Para quem está fora do circuito, slé uma ferramenta de linha de comando cômica, destinada a enganar as pessoas se elas digitarem errado 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 do manual sl, ele declara o seguinte bug:

BUGS
        It rarely shows contents of current directory.

Assim, a questão permanece, existem algumas condições, sob as quais slrealmente não mostrar o diretório atual?


45
+1 por me apresentar um utilitário muito útil que eu desconhecia há décadas.
precisa saber é o seguinte

3
@slm Nós assertained que, assim que eu colocar em um bug que aborda esta questão crítica: # 9

44
Ele diz que raramente mostra o conteúdo do diretório. Então, presumo que eles digam se você tiver arquivos como | | | H |__--------------------| [___] | =| |, sl os mostra.
Sr. Lister


7
Sou administrador de sistemas Unix / Linux há 14 anos e nunca tinha ouvido falar dessa ferramenta incrível. É incrível o quanto há para aprender.
Michael Martinez

Respostas:


183

Até onde eu sei, a única condição na qual slmostra o diretório atual é quando você o digita errado ls.


8
+1 Bem-humorado, mas espero uma resposta mais autoritária.

37
@LegoStormtroopr - talvez você esteja esperando o LegoEmperor pesar?
precisa saber é o seguinte

42
  • Lema: slimprime uma locomotiva a vapor
  • Lema: nomes de arquivos válidos não podem conter barras (embora os caminhos possam)
  • Lema: 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: slnunca mostra o diretório atual. QED.


6
Ele contém vários /'es, que não são permitidos nos nomes de arquivos do Unix.
mtak

2
Se você fez um, mkdir -p "$(dirname "$(sl)")"você poderia fazer touch "$(sl)". Obviamente, você pode estar testando os limites do seu OS / FS. E divirta-se limpando isso.
Kevin

3
@ MrLister Certamente isso só seria possível se o sistema de arquivos também tivesse um bug para permitir a criação desses arquivos. Você possui uma referência?
precisa saber é o seguinte

1
@ VolkerSiegel: Na verdade não. O Windows suporta ambos /e \, e eles significam a mesma coisa.
amigos estão dizendo sobre Konrad Borowski

3
Se você tem um arquivo chamado H(por exemplo), slele realmente o mostra. É que também mostra muitas outras coisas. :-)
ShreevatsaR

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] == '-') {

5
Oh senhor. Você senhor é um estudioso e um gênio.


1
Sabe, eu realmente não tenho ideia de como fazer isso? Eu não uso o github, exceto como um portal de download baseado na Web para o software de outras pessoas. Você pode fazer isso se quiser. Exclusão oficialmente todos os direitos autorais do código acima e o coloco em domínio público.
Ionoclast Brigham

+1, mas isso não é exatamente 10% - rand() "Retorna um número inteiro pseudo-aleatório no intervalo entre 0 e RAND_MAX", que é a biblioteca-dependente, mas pode não ser divisível por 100.
l0b0

1
Tecnicamente, as funções execx () podem retornar. From man 3 exec: "Se alguma das funções exec () retornar, ocorrerá um erro. O valor de retorno é -1 e a variável global errno será configurada para indicar o erro."
Ionoclast Brigham


12

Observe que a resposta de I0b0 é apenas uma prova que slnunca exibirá toda e apenas a lista de diretórios atual. No entanto, há circunstâncias em que sla lista de diretórios atual será exibida juntamente com 'informações' adicionais.

Por exemplo, em um diretório vazio:

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

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


3
Ou, o diretório atual pode ser um conjunto vazio. Nesse caso, todos os arquivos (inexistentes) são exibidos junto com a imagem de um trem. :-)
Kevin Seifert

6

Eu sei que Lego Stormtroopr tem registrado um ingresso de modo que a questão crítica pode ser abordada. Quem sabe quanto tempo leva para uma correção ser lançada?

Como tal, forneci uma solução alternativa para minimizar o impacto devido ao grave problema. Você pode criar uma função shell slque seria executada sl:

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

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


2

Se você usar o apelido ls, ele imprimirá o diretório atual - de fato, quando parei de rir da locomotiva a vapor, adicionei isso à minha lista de apelidos.


1

Você sempre pode revisar o código fonte para si mesmo e não veria em nenhuma condição que ele execute o lscomando real nem exiba os diretórios.

https://github.com/mtoyoda/sl

A fonte é bastante simples, na verdade. Mesmo se você "não é um codificador", ainda deve entender a maior parte.

Eu acredito que o "bug" que você postou acima é realmente apenas de brincadeira (e para causar uma discussão como essa, lol)


1

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

Na verdade, tenho vários apelidos para ls, incluindo

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

então obrigado pela sugestão - vou adicionar

alias sl='ls -FG'

(Não que eu me lembre de digitar, slmas depois eu tendem a nós llou lh!)


-1

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

mv / usr / jogos / sl / usr / jogos / sl-OLD

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

nano / usr / jogos / sl

Cole a seguinte:

#! / bin / bash

eco "Você digitou 'sl' em vez de 'ls'!"

/ usr / games / sl-old

eco "Acho que posso listá-lo de qualquer maneira ..."

/ bin / ls

Pressione CTRL + X para sair e Y para salvar.

nano / usr / jogos / LS

Cole a seguinte:

#! / bin / bash

eco "Você digitou 'LS' em vez de 'ls'!"

/ usr / games / sl-old

eco "Acho que posso listá-lo de qualquer maneira ..."

/ bin / ls

Pressione CTRL + X para sair e Y para salvar.

PS: Você é bem-vindo por reviver isso. A busca pelo "comando sl linux" ainda traz esse tópico, então pensei em dar uma resposta real sobre como fiz com que ele listasse os arquivos ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.