sl是否显示当前目录?


106

对于那些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真正显示当前目录?


45
+1是为了向我介绍一个非常有用的实用程序,我几十年来一直没有意识到。
devnull

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

44
它说它很少显示目录的内容。因此,我认为它们的意思是如果您有像| | | H |__--------------------| [___] | =| |sl 这样的文件,则会显示它们。
李斯特先生,2014年

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

7
我担任Unix / Linux系统管理员已有14年了,从来没有听说过这个令人难以置信的工具。有很多东西要学,真是令人惊讶。
Michael Martinez

Answers:


183

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


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

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

42
  • Lemma: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
它包含多个/'es,Unix文件名中不允许使用。
mtak 2014年

2
如果你做了一个,mkdir -p "$(dirname "$(sl)")"你可以做touch "$(sl)"。当然,您可能正在测试OS / FS的限制。并乐于清理。
凯文

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

1
@VolkerSiegel:不是。Windows同时支持/\,它们含义相同。
Konrad Borowski14年

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

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

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

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


12

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

例如,在一个空目录中:

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

将在前六行中列出目录的内容,而在其余十行中,将使用火车图像(不抽烟)方便地修饰此列表。


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

6

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

因此,我提供了一种解决方法,以使由于严重问题而造成的影响最小化。您可以创建sl将执行的Shell函数sl

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

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


2

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


1

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

https://github.com/mtoyoda/sl

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

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


1

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

我实际上对ls有几个别名,包括

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

非常感谢您的建议-我将添加

alias sl='ls -FG'

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


-1

你可以像我一样...

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

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

纳米/ usr / games / sl

粘贴以下内容:

#!/ bin / bash

回声“您键入'sl'代替'ls'!”

/ usr / games / sl-old

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

/ bin / ls

按CTRL + X退出,然后按Y保存。

纳米/ usr / games / LS

粘贴以下内容:

#!/ bin / bash

回声“您键入了'LS',而没有'ls'!”

/ usr / games / sl-old

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

/ bin / ls

按CTRL + X退出,然后按Y保存。

PS:欢迎您恢复此操作。搜索“ sl linux command”仍然会显示此线程,因此我想我将给出一个关于如何使其列出文件的真实答案……

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.