对于不熟悉这些的人,sl是一个幽默的命令行工具,用于在人们输错ls时将其绊倒。调用时,它会打印Steam机车。例如:

                          (  ) (@@) ( )  (@)  ()    @@    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确实会在某些情况下显示当前目录吗?

评论

+1向我介绍了几十年来我从未意识到的非常有用的实用程序。

@slm我们已经确定了这一点,所以我放入了一个解决此关键问题的错误:#9

它说它很少显示目录的内容。因此,我认为它们的意思是如果您有| | | | H | __-------------------- | [___] | = | |,sl显示它们。

拉取请求公司:github.com/mtoyoda/sl/pull/11

我担任Unix / Linux系统管理员已有14年了,从来没有听说过这个令人难以置信的工具。学到了多少东西真是太神奇了。

#1 楼

据我所知,sl显示当前目录的唯一条件是您将其错误键入为ls

评论


+1幽默,但我希望得到一个更权威的答案。

–user53306
2014年4月15日在1:46

@LegoStormtroopr-也许您正在等待LegoEmperor参与进来?

–mikeserv
14年4月15日在1:51

#2 楼


引理: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。

评论


它包含几个/,在Unix文件名中是不允许的。

–mtak
14年4月15日在15:03

如果您执行了mkdir -p“ $(dirname” $(sl)“)”“,则可以触摸” $(sl)“。当然,您可能正在测试OS / FS的限制。并乐于清理。

–凯文
2014年4月15日在18:51



@MrLister当然,只有在文件系统中也存在允许创建此类文件的错误时,这才有可能。你有参考吗?

–l0b0
14年4月16日在7:17

@VolkerSiegel:不是。 Windows同时支持/和\,它们含义相同。

– Konrad Borowski
2014年4月17日在9:38



如果您有一个名为H的文件(例如),则sl确实会显示它。只是它还显示了许多其他内容。 :-)

–ShreevatsaR
2014年4月20日在12:52

#3 楼

这是修复该错误的补丁:)

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


评论


我的天。您先生是学者和天才。

–user53306
2014年4月16日在2:57

请...请...提交该补丁的请求请求

–user53306
14年4月16日在3:51

知道,我实际上不知道该怎么做?除了作为其他软件的基于Web的下载门户之外,我自己不使用github。如果愿意,可以这样做。我正式声明放弃上述代码的所有版权,并将其置于公共领域。

–电离破碎的布里格姆
2014年4月16日下午3:57

+1,但不完全是10%-rand()“返回介于0到RAND_MAX之间的伪随机整数”,它与库有关,但不能被100整除。

–l0b0
2014年4月16日7:19



从技术上讲,execx()函数可以返回。来自man 3 exec:“如果任何exec()函数返回,将发生错误。返回值为-1,并且将设置全局变量errno来指示错误。”

–电离破碎的布里格姆
14年4月16日在16:40

#4 楼

您可以在此处查看源代码-https://github.com/mtoyoda/sl,a,除了已记录的选项外,没有其他选择,可惜的是没有任何选项可以实际打印文件名。

所以看起来@sfyn的答案是正确的。

评论


感谢您提供的链接,我已向开发人员提交了一张票,以查看是否可以解决。

–user53306
14年4月15日在1:58

@LegoStormtroopr,确实是一个关键问题。

– Graeme
2014年4月15日在2:01

这可能是自Heartbleed以来最大的bug!

–user53306
14年4月15日在6:30

#5 楼

请注意,I0b0的答案仅是sl将永远不会显示全部,而只会显示当前目录列表的证明。但是,在某些情况下,sl将显示当前目录列表以及其他“信息”。例如,在空目录中:

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


前六行将列出目录的内容,而后十行将方便地使用火车图像(无烟)修饰此清单。

评论


或者,当前目录可能是一个空集。在这种情况下,所有(不存在的)文件都会与火车图片一起显示。 :-)

–凯文·塞弗特(Kevin Seifert)
15年11月17日在17:49

#6 楼

我知道Lego Stormtroopr已经记录了一张票,以便可以解决关键问题。谁知道发布修补程序可能需要花费很多时间?

因此,我提供了一种解决方法,可以将严重问题带来的影响降至最低。您可以创建将执行sl的Shell函数sl

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


现在调用sl会偶尔列出目录内容。

#7 楼

如果将其别名为ls,它将打印当前目录-实际上,一旦我停止嘲笑蒸汽机车,便将其添加到别名列表中。

#8 楼

您可以随时自己查看它的源代码,并且在任何情况下都不会看到它执行实际的ls命令或显示目录。

https://github.com/mtoyoda/sl

实际上来源很简单。即使您不是“编码人员”,您也仍然应该能够理解其中的大部分内容。

我相信您上面发布的“错误”实际上只是在开玩笑(并引起像这样的大声笑) )

#9 楼

是的,如果您在bash或正在使用的任何shell中设置适当的别名,sl的行为将与ls一样!

我实际上为ls包括了多个别名,包括

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


所以谢谢你的建议-我将添加

alias sl='ls -FG'


(不是我曾经记得键入sl,但是后来我倾向于我们lllh !)

#10 楼

您可以像我一样...



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

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

nano / usr / games / sl


粘贴以下内容:


#!/ bin / bash

回显“ YOU TYPED'sl'INSTEAD OF'ls'!”

/ usr / games / sl- old

echo“猜我仍然可以列出它...”

/ bin / ls



按CTRL + X退出,Y保存。

nano / usr / games / LS


粘贴以下内容:


#!/ bin / bash

回显“ YOU TYPED'LS'INSTEAD OF'ls'!”

/ usr / games / sl-old

echo“猜想我仍然可以列出它...”

/ bin / ls



按CTRL + X键退出并Y到sav e。



PS:欢迎您恢复此设置。搜索“ sl linux command”仍然可以使该线程生效,所以我想我会给出一个真实的答案。关于如何使它列出文件的答案...