对于那些不熟悉的人来说,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
实际上做显示当前目录?
答案1
据我所知,sl
显示当前目录的唯一条件是当您将其错误输入为ls
.
答案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
从不显示当前目录。量子电子器件。
答案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] == '-') {
答案4
请注意,I0b0 的答案只是一个证明,sl
永远不会显示所有和仅有的当前目录列表。但是,在某些情况下,sl
会显示当前目录列表以及其他“信息”。
例如,在空目录中:
$ touch ' ( ) (@@) ( ) (@) () @@ O @ O @ O'
$ touch ' (@@@)'
$ touch ' ( )'
$ touch ' (@@@@)'
$ touch ' ( )'
$ sl
将在前六行列出目录的内容,在其余 10 行将方便地用火车图像(无烟)修饰此列表。