Czy `sl` wyświetla kiedykolwiek bieżący katalog?

106

Dla tych, którzy nie są w pętli, sljest humorystycznym narzędziem wiersza poleceń, które ma na celu podnieść ludzi, jeśli się pomylą ls. Po wywołaniu drukuje Lokomotywę Steam. Na przykład:

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

Jednak na stronie podręcznika użytkownika zawiera slnastępujący błąd:

BUGS
        It rarely shows contents of current directory.

Więc pozostaje pytanie, czy są jakieś warunki, na podstawie których slfaktycznie nie pokazują bieżący katalog?

Braiam
źródło
45
+1 za zapoznanie mnie z bardzo użytecznym narzędziem , którego nie znałem od dziesięcioleci.
devnull
3
@slm Potwierdziliśmy to, więc zgłosiłem błąd, który rozwiązuje ten krytyczny problem: # 9
44
Mówi, że rzadko pokazuje zawartość katalogu. Zakładam więc, że mają na myśli, jeśli masz pliki typu | | | H |__--------------------| [___] | =| |, sl je pokazuje.
Pan Lister
3
Pull Request inc: github.com/mtoyoda/sl/pull/11
asteri
7
Od 14 lat jestem administratorem systemu Unix / Linux i nigdy nie słyszałem o tym niesamowitym narzędziu. To niesamowite, ile trzeba się nauczyć.
Michael Martinez,

Odpowiedzi:

183

O ile mi wiadomo, jedynym warunkiem, w którym slpokazuje bieżący katalog, jest błędne wpisanie go jako ls.

sfyn
źródło
8
+1 Humorystyczny, ale mam nadzieję na bardziej wiarygodną odpowiedź.
37
@LegoStormtroopr - być może czekasz, aż LegoEmperor waży?
mikeserv
42
  • Lemma: sldrukuje lokomotywę parową
  • Lemma: Prawidłowe nazwy plików nie mogą zawierać ukośników (chociaż ścieżki mogą)
  • Lemma: Lokomotywa parowa zawiera ukośniki:

    $ 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
    

Wniosek: slnigdy nie pokazuje bieżącego katalogu. CO BYŁO DO OKAZANIA.

10b0
źródło
6
Zawiera kilka /plików, które nie są dozwolone w nazwach plików systemu Unix.
mtak
2
Gdybyś to zrobił, mkdir -p "$(dirname "$(sl)")"możesz to zrobić touch "$(sl)". Oczywiście możesz testować ograniczenia swojego systemu operacyjnego / FS. I baw się dobrze, sprzątając to.
Kevin
3
@MrLister Z pewnością byłoby to możliwe tylko wtedy, gdy system plików miał również błąd umożliwiający tworzenie takich plików. Czy masz referencje?
l0b0
1
@VolkerSiegel: Nie bardzo. Windows obsługuje zarówno /a \, i one oznaczają to samo.
Konrad Borowski
3
Jeśli masz plik o nazwie H(na przykład), to slrzeczywiście go pokazuje. Po prostu pokazuje wiele innych rzeczy. :-)
ShreevatsaR
38

Oto łatka, aby naprawić ten błąd :)

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
źródło
5
O Boże. Pan jest uczonym i geniuszem.
1
Wiesz, właściwie nie mam pojęcia jak to zrobić? Sam nie używam github z wyjątkiem internetowego portalu pobierania oprogramowania innych osób. Możesz to zrobić, jeśli chcesz. Oficjalnie zrzekam się wszelkich praw autorskich do powyższego kodu i umieszczam go w domenie publicznej.
Ionoclast Brigham
+1, ale nie jest to dokładnie 10% - rand() „Zwraca pseudolosową liczbę całkowitą z zakresu od 0 do RAND_MAX”, która jest zależna od biblioteki, ale może nie być podzielna przez 100.
l0b0 16.04.14
1
Technicznie funkcje execx () mogą zwracać. From man 3 exec: „Jeśli którakolwiek z funkcji exec () powróci, wystąpi błąd. Zwracana jest wartość -1, a globalna zmienna errno zostanie ustawiona w celu wskazania błędu.”
Ionoclast Brigham
24

Możesz sprawdzić kod źródłowy tutaj - https://github.com/mtoyoda/sl , ale nie ma innych opcji oprócz tych udokumentowanych i niestety nic, co faktycznie wydrukuje nazwy plików.

Wygląda więc na to, że odpowiedź @ sfyn jest poprawna.

Graeme
źródło
5
@LegoStormtroopr, istotnie problem krytyczny.
Graeme,
5
Prawdopodobnie największy błąd od czasu Heartbleed!
12

Zauważ, że odpowiedź I0b0 jest tylko dowodem, slktóry nigdy nie wyświetli wszystkich i tylko bieżącej listy katalogów. Są jednak okoliczności, w których slwyświetli się bieżąca lista katalogów wraz z dodatkowymi „informacjami”.

Na przykład w pustym katalogu:

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

na pierwszych sześciu liniach wyświetli zawartość katalogu, a na pozostałych 10 liniach wygodnie ozdobi tę listę obrazem pociągu (bez dymu).

JP
źródło
3
Lub bieżący katalog może być pustym zestawem. W takim przypadku wyświetlane są wszystkie (nieistniejące) pliki wraz ze zdjęciem pociągu. :-)
Kevin Seifert
6

Wiem, że Lego Stormtroopr jest zalogowany bilet tak, że krytyczny problem może być uwzględnione. Kto wie, ile czasu może zająć wdrożenie poprawki?

W związku z tym przedstawiłem obejście, aby zminimalizować wpływ związany z poważną kwestią. Możesz utworzyć funkcję powłoki sl, która wykona sl:

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

Teraz wywoływanie slsporadycznie wyświetla zawartość katalogu.

diabelnie
źródło
2

Jeśli nadasz mu alias ls, wydrukuje bieżący katalog - w rzeczywistości, kiedy przestałem się śmiać z lokomotywy parowej, dodałem to do mojej listy aliasów.

zwłaszcza tipsy
źródło
1

Zawsze możesz przejrzeć jego kod źródłowy i nie zobaczysz, że pod żadnym warunkiem nie wykonuje rzeczywistego lspolecenia ani nie wyświetla katalogów.

https://github.com/mtoyoda/sl

Źródło jest właściwie dość proste. Nawet jeśli nie jesteś programistą, powinieneś być w stanie zrozumieć większość z nich.

Uważam, że „błąd”, który opublikowałeś powyżej, jest naprawdę po prostu żartem (i spowodowanie takiej dyskusji jak ten lol)

SnakeDoc
źródło
1

Tak, slbędzie działać tak samo jak ls, jeśli ustawisz odpowiedni alias w bash lub jakiejkolwiek powłoce, której używasz!

Mam kilka aliasów dla ls, w tym

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

więc dziękuję za sugestię - dodam

alias sl='ls -FG'

(Nie to, że kiedykolwiek pamiętam pisanie, slale potem mam tendencję do nas lllub lh!)

David MW Powers
źródło
-1

Możesz zrobić tak samo jak ja ...

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

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

nano / usr / games / sl

Wklej następujące:

#! / bin / bash

echo „TY TYP” sl ”ZAMIAST„ ls ”!”

/ usr / games / sl-old

echo „Chyba i tak mogę to wymienić ...”

/ bin / ls

Naciśnij CTRL + X, aby wyjść, a Y, aby zapisać.

nano / usr / games / LS

Wklej następujące:

#! / bin / bash

echo „TY TYP„ LS ”ZAMIAST„ ls ”!”

/ usr / games / sl-old

echo „Chyba i tak mogę to wymienić ...”

/ bin / ls

Naciśnij CTRL + X, aby wyjść, a Y, aby zapisać.

PS: Nie ma za co przywracać to ... wyszukiwanie do "sl linux command" wciąż podnosi ten wątek, więc pomyślałem, że dam prawdziwą odpowiedź, w jaki sposób zmusiłem go do wyświetlenia listy plików ...

Thread_Reviver
źródło