`sl` 会显示当前目录吗?

107 linux

对于那些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_|
     \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/
Run Code Online (Sandbox Code Playgroud)

但是,在 的手册页中sl,它指出了以下错误:

BUGS
        It rarely shows contents of current directory.
Run Code Online (Sandbox Code Playgroud)

所以,问题依然存在,还有一些条件下,这sl实际上显示当前目录?

小智 188

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

  • @LegoStormtroopr - 也许您正在等待 LegoEmperor 称重? (37认同)
  • +1 幽默,但我希望得到更权威的答案。 (9认同)

l0b*_*0b0 41

  • 引理: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
    
    Run Code Online (Sandbox Code Playgroud)

结论:sl从不显示当前目录。QED。

  • 它包含几个`/`,这在Unix 文件名中是不允许的。 (6认同)
  • @MrLister 当然,只有在文件系统中也存在允许创建此类文件的错误时才有可能。你有参考吗? (3认同)
  • 如果您有一个名为 `H` 的文件(例如),那么 `sl` 确实会显示它。只是它还展示了很多其他的东西。:-) (3认同)
  • 如果你做了一个 `mkdir -p "$(dirname "$(sl)")"` 你可以做 `touch "$(sl)"`。当然,您可能正在测试 OS/FS 的限制。并享受清理它的乐趣。 (2认同)
  • @VolkerSiegel:不是真的。Windows 支持 `/` 和 ``\``,它们的意思是一样的。 (2认同)

Ion*_*ham 37

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

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] == '-') {
Run Code Online (Sandbox Code Playgroud)

  • 我的天。先生,您是一位学者和天才。 (5认同)
  • 请...请... [为该补丁提交拉取请求](https://github.com/mtoyoda/sl/pulls) (3认同)

Gra*_*eme 23

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

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

  • 感谢您的链接,我已经[向开发人员提交了一张票,看看是否可以解决](https://github.com/mtoyoda/sl/issues/9)。 (7认同)
  • @LegoStormtroopr,确实是一个关键问题。 (5认同)
  • 可能是自 Heartbleed 以来最大的错误! (5认同)

小智 12

请注意,I0b0 的答案只是一个证明,sl永远不会显示所有且显示当前目录列表。但是,在某些情况下sl会显示当前目录列表以及附加“信息”。

例如,在一个空目录中:

$ touch '                          (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O'
$ touch '                   (@@@)'
$ touch '                  (    )'
$ touch '              (@@@@)'
$ touch '            (   )'
$ sl
Run Code Online (Sandbox Code Playgroud)

将在前 6 行列出目录的内容,在其余 10 行将方便地用火车图像(没有烟雾)修饰此列表。

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

dev*_*ull 7

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

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

sl() {
  ((RANDOM%42)) && command sl || ls;
}
Run Code Online (Sandbox Code Playgroud)

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