`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_|
     \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

Тем не менее, в справочной странице для sl, это заявляет следующую ошибку:

BUGS
        It rarely shows contents of current directory.

Таким образом, остается вопрос, есть ли какие - то условия, при которых на slсамом деле это показывает текущий каталог?


45
+1 за то, что познакомил меня с очень полезной утилитой, о которой я не знал десятилетиями.
devnull

3
@slm Мы убедились в этом, поэтому я добавил ошибку, которая решает эту критическую проблему: # 9

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

3
Запрос на извлечение вкл .: github.com/mtoyoda/sl/pull/11
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 Конечно, это было бы возможно только в том случае, если в файловой системе также была ошибка, позволяющая создавать такие файлы. У вас есть ссылка?
10

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
О, Боже. Вы, сэр, ученый и гений.

3
Пожалуйста ... пожалуйста ...

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

+1, но это не совсем 10% - rand() «Возвращает псевдослучайное целое число в диапазоне от 0 до RAND_MAX», которое зависит от библиотеки, но не может делиться на 100.
l0b0

1
Технически, функции execx () могут возвращаться. From man 3 exec: «Если какая-либо из функций exec () вернется, произойдет ошибка. Возвращаемое значение равно -1, и глобальная переменная errno будет установлена ​​для указания ошибки».
Ионокласт Бригам

24

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

Так что, похоже , ответ @ sfyn правильный.



5
@LegoStormtroopr, действительно критическая проблема.
Грэм

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 или любой другой оболочке, которую вы используете!

У меня есть несколько псевдонимов для Ls, включая

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

так что спасибо за предложение - добавлю

alias sl='ls -FG'

(Не то, чтобы я когда-либо вспоминал, как печатать, slно я склонен к нам llили lh!)


-1

Вы могли бы сделать так же, как и я ...

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

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

nano / usr / games / sl

Вставьте следующее:

#! / Bin / Баш

echo "ВЫ ТИПИРУЛИ 'sl' ВМЕСТО 'ls'!"

/ USR / игры / SL-старый

echo "Думаю, я могу перечислить это в любом случае ..."

/ бен / лс

Нажмите CTRL + X для выхода и Y для сохранения.

nano / usr / games / LS

Вставьте следующее:

#! / Bin / Баш

echo "ВЫ ТИПИЛИ" LS "ВМЕСТО" ls "!"

/ USR / игры / SL-старый

echo "Думаю, я могу перечислить это в любом случае ..."

/ бен / лс

Нажмите CTRL + X для выхода и Y для сохранения.

PS: добро пожаловать за то, что вы возродили это .. поиск по "sl linux command" все еще вызывает эту тему, поэтому я подумал, что я бы дал реальный ответ о том, как я сделал это, перечислил файлы ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.