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 楼
据我所知,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
,但是后来我倾向于我们ll
或lh
!)#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”仍然可以使该线程生效,所以我想我会给出一个真实的答案。关于如何使它列出文件的答案...
评论
+1向我介绍了几十年来我从未意识到的非常有用的实用程序。@slm我们已经确定了这一点,所以我放入了一个解决此关键问题的错误:#9
它说它很少显示目录的内容。因此,我认为它们的意思是如果您有| | | | H | __-------------------- | [___] | = | |,sl显示它们。
拉取请求公司:github.com/mtoyoda/sl/pull/11
我担任Unix / Linux系统管理员已有14年了,从来没有听说过这个令人难以置信的工具。学到了多少东西真是太神奇了。