Чи відображає `sl` поточний каталог?


106

Для тих, хто вийшов з циклу, slце гумористичний інструмент командного рядка, який призначений для подорожі людей, якщо вони вводять помилку ls. При виклику він друкує паровоз. Наприклад:

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

Однак на сторінці man для slвказується така помилка:

BUGS
        It rarely shows contents of current directory.

Таким чином, залишається питання, чи є якісь - то умови, при яких на slсамому ділі це показує поточний каталог?


45
+1 за ознайомлення з дуже корисною програмою, про яку я не знав десятиліттями.
devnull

3
@slm Ми це запевнили, тому я поставив помилку, яка вирішує цю критичну проблему: # 9

44
Каже, він рідко показує вміст каталогу. Тому я припускаю, що вони мають на увазі, якщо у вас є такі файли, як | | | H |__--------------------| [___] | =| |їх показує sl.
Містер Лістер

3
Запит на тягнення
asteri

7
Я був систематиком Unix / Linux протягом 14 років і ніколи не чув про цей неймовірний інструмент. Дивно, скільки є чому вчитися.
Майкл Мартінес

Відповіді:


183

Наскільки мені відомо, єдина умова, за якою slвідображається поточний каталог, - це коли ви введете його як ls.


8
+1 Гумористично, але я сподіваюся на більш авторитетну відповідь.

37
@LegoStormtroopr - можливо, ви чекаєте LegoEmperor зважити?
mikeserv

42
  • Лема: slдрукує паровоз
  • Лема: Дійсні назви файлів не можуть містити косої риски вперед (хоча шляхи можуть)
  • Лема: паровий локомотив містить прямі коси:

    $ 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
    

Висновок: slніколи не відображається поточний каталог. QED.


6
Він містить декілька /'ес, які заборонено в іменах Unix.
mtak

2
Якщо ви зробили це, mkdir -p "$(dirname "$(sl)")"то можете зробити touch "$(sl)". Звичайно, ви можете протестувати межі вашої ОС / FS. І весело прибираючи це.
Кевін

3
@MrLister Безумовно, що це було б можливо лише в тому випадку, якщо файлова система також мала помилку в ній, щоб дозволити створювати такі файли. У вас є довідник?
l0b0

1
@VolkerSiegel: Не дуже. Windows підтримує /і те \, і вони означають те саме.
Конрад Боровський

3
Якщо у вас є файл з назвою H(наприклад), він slдійсно показує його. Просто це також показує багато іншого. :-)
ShreevatsaR

38

Ось патч, щоб виправити цю помилку :)

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
О Боже. Ви, сер, науковець і геній.


1
Знаєте, я насправді поняття не маю, як це зробити? Я сам не використовую github, окрім як веб-портал завантажень програмного забезпечення для інших людей. Ви можете це зробити, якщо хочете. Я офіційно відмовляюсь від усіх авторських прав на вищезазначений код і розміщую його у відкритому доступі.
Іонокласт Брігхем

+1, але це не зовсім 10% - rand() "Повертає псевдовипадкове інтегральне число в діапазоні між 0 і RAND_MAX", яке залежить від бібліотеки, але може бути не діленим на 100.
l0b0

1
Технічно функції execx () можуть повернутися. З man 3 exec: "Якщо будь-яка з функцій exec () повертається, сталася помилка. Значення повернення дорівнює -1, і глобальна змінна errno буде встановлена, щоб вказати на помилку."
Іонокласт Брігхем

24

Ви можете перевірити вихідний код тут - https://github.com/mtoyoda/sl , на жаль, немає інших варіантів, окрім задокументованих, і, на жаль, нічого, що насправді надрукує імена файлів.

Так виглядає, що відповідь @ sfyn є правильною.



5
@LegoStormtroopr, дійсно критична проблема.
Graeme

5
Можливо, найбільша помилка з моменту Heartbleed!

12

Зауважте, що відповідь I0b0 - це лише доказ, який slніколи не відображатиме всі та лише поточний перелік каталогів. Однак є обставини, за яких slвідображатиметься поточний перелік каталогів разом з додатковою інформацією.

Наприклад, у порожньому каталозі:

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

буде в перших шести рядках перелічити вміст каталогу, а на решті 10 рядків зручно прикрасити цей список із зображенням поїзда (без диму).


3
Або поточний каталог може бути порожнім набором. У такому випадку всі (неіснуючі) файли відображаються разом із зображенням поїзда. :-)
Кевін Сейферт

6

Я знаю , що Lego Stormtroopr вже зареєстрував квиток так , що критична проблема може бути вирішена. Хто знає, скільки часу може знадобитися, щоб виправити виправлення?

Як такий, я запропонував рішення, щоб вплив через серйозну проблему був мінімізований. Ви можете створити функцію оболонки, slяка б виконувала sl:

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

Тепер виклик slбуде періодично перераховувати вміст каталогу.


2

Якщо ви його псевдонімом ls, він надрукує поточний каталог - фактично, як тільки я перестав сміятися над паровозом, я додав це до свого списку псевдонімів.


1

Ви завжди можете переглянути свій вихідний код для себе, і ви побачите, ні за яких умов він ніколи не виконує фактичну lsкоманду і не відображає каталоги.

https://github.com/mtoyoda/sl

Джерело насправді досить просте. Навіть якщо ви "не кодер", ви все-таки маєте змогу зрозуміти більшість цього.

Я вважаю, що "помилка", яку ви опублікували вище, насправді просто на жарт (і викликати дискусію, як ця хаха)


1

Так, slбуде діяти так само, як і ls, якщо ви встановите відповідний псевдонім у bash або будь-якій оболонці, яку ви використовуєте!

У мене фактично є кілька псевдонімів, включаючи лс

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

тому дякую за пропозицію - додам

alias sl='ls -FG'

(Не те, що я коли-небудь пам’ятаю набравши текст, slале тоді я схильний до нас llабо lh!)


-1

Ви можете зробити так, як і я ...

mv / usr / ігри / sl / usr / ігри / sl-СТАРИЙ

mv / usr / ігри / LS / usr / ігри / LS-OLD

nano / usr / ігри / sl

Вставте наступне:

#! / бін / баш

echo "ВИ ВИБИРАЄТЬСЯ" sl "ВСТАНОВИТИ" ls "!"

/ usr / ігри / sl-old

відлуння "Здогадайтесь, я можу це перерахувати будь-коли ..."

/ бін / л

Натисніть CTRL + X для виходу та Y для збереження.

nano / usr / ігри / LS

Вставте наступне:

#! / бін / баш

ехо "ВИ ВИБИРАЛИ" LS "ВМЕСТО" ls "!"

/ usr / ігри / sl-old

відлуння "Здогадайтесь, я можу це перерахувати будь-коли ..."

/ бін / л

Натисніть CTRL + X для виходу та Y для збереження.

PS: Вас вітає відродження цього .. пошук "sl linux command" все ще підводить цю нитку, тому я подумав, що дам справжню відповідь щодо того, як я змусив її перерахувати файли ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.