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?

Braiam
fonte
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
3
Puxe Pedido inc: github.com/mtoyoda/sl/pull/11
Asteri
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.

sfyn
fonte
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.

l0b0
fonte
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] == '-') {
Ionoclast Brigham
fonte
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
24

Você pode verificar o código fonte aqui - https://github.com/mtoyoda/sl , mas não há outras opções além das documentadas e, infelizmente, nada que realmente imprima os nomes dos arquivos.

Parece que a resposta do @ sfyn é a correta.

Graeme
fonte
5
@LegoStormtroopr, de fato uma questão crítica.
Graeme
5
Possivelmente o maior erro desde Heartbleed!
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).

JP
fonte
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.

devnull
fonte
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.

notavelmente
fonte
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)

SnakeDoc
fonte
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!)

David MW Powers
fonte
-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 ...

Thread_Reviver
fonte