Liệu `sl` có bao giờ hiển thị thư mục hiện tại không?


106

Đối với những người ngoài vòng lặp, sllà một công cụ dòng lệnh hài hước có nghĩa là làm vấp ngã mọi người nếu họ gõ nhầm ls. Khi được gọi nó sẽ in một đầu máy hơi nước. Ví dụ:

                          (  ) (@@) ( )  (@)  ()    @@    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_|
     \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

Tuy nhiên, trong trang man cho sl, nó nêu lỗi sau:

BUGS
        It rarely shows contents of current directory.

Vì vậy, câu hỏi vẫn còn, đang có một số điều kiện, theo đó slthực sự không hiển thị thư mục hiện hành?


45
+1 để giới thiệu cho tôi một tiện ích rất hữu ích mà tôi không biết trong nhiều thập kỷ.
devnull

3
@slm Chúng tôi đã khẳng định rằng, vì vậy tôi đã gặp phải một lỗi giải quyết vấn đề quan trọng này: # 9

44
Nó nói rằng nó hiếm khi hiển thị nội dung của thư mục. Vì vậy, tôi cho rằng chúng có nghĩa là nếu bạn có tập tin như | | | H |__--------------------| [___] | =| |, sl hiển thị chúng.
Ông Lister

3
Yêu cầu kéo inc: github.com/mtoyoda/sl/pull/11
asteri

7
Tôi đã là một sysadmin Unix / Linux trong 14 năm và chưa bao giờ nghe nói về công cụ đáng kinh ngạc này. Thật đáng ngạc nhiên khi có nhiều thứ để học.
Michael Martinez

Câu trả lời:


183

Theo như tôi biết, điều kiện duy nhất slhiển thị thư mục hiện tại là khi bạn gõ nhầm nó thành ls.


8
+1 Hài hước, nhưng tôi hy vọng câu trả lời có thẩm quyền hơn.

37
@LegoStormtroopr - có lẽ bạn đang chờ LegoEmaoh cân nhắc?
mikeerv

42
  • Bổ đề: slin một đầu máy hơi nước
  • Bổ đề: Tên tệp hợp lệ không thể chứa dấu gạch chéo (mặc dù đường dẫn có thể)
  • Bổ đề: Đầu máy hơi nước chứa các dấu gạch chéo về phía trước:

    $ 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
    

Kết luận: slkhông bao giờ hiển thị thư mục hiện tại. QED.


6
Nó chứa một số /es, không được phép trong tên tệp Unix.
mtak

2
Nếu bạn đã làm một mkdir -p "$(dirname "$(sl)")"bạn có thể làm touch "$(sl)". Tất nhiên, bạn có thể đang kiểm tra giới hạn của HĐH / FS của mình. Và vui vẻ dọn dẹp mà lên.
Kevin

3
@MrLister Chắc chắn điều đó chỉ có thể xảy ra nếu hệ thống tệp cũng có lỗi trong đó để cho phép các tệp đó được tạo. Bạn đã có một tài liệu tham khảo?
l0b0

1
@VolkerSiegel: Không hẳn. Windows hỗ trợ cả hai /\, và chúng có nghĩa là cùng một điều.
Konrad Borowski

3
Nếu bạn có một tệp được gọi H(ví dụ), thì slthực sự hiển thị nó. Chỉ là nó cũng cho thấy rất nhiều thứ khác. :-)
ShreevatsaR

38

Đây là một bản vá để sửa lỗi đó :)

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
Chúa ơi. Bạn là một học giả và một thiên tài.

3
Vui lòng ... vui lòng ... gửi yêu cầu kéo cho bản vá đó

1
Vâng, tôi thực sự không biết làm thế nào để làm điều đó? Tôi không sử dụng github cho mình trừ cổng thông tin tải xuống dựa trên web cho phần mềm của người khác. Bạn có thể làm điều đó nếu bạn thích. Tôi chính thức từ chối mọi bản quyền về mã trên và đặt nó vào phạm vi công cộng.
Ionoclast Brigham

+1, nhưng đó không chính xác là 10% - rand() "Trả về số nguyên ngẫu nhiên giả trong phạm vi từ 0 đến RAND_MAX" , phụ thuộc vào thư viện nhưng có thể không chia hết cho 100.
l0b0

1
Về mặt kỹ thuật, các hàm execx () có thể trả về. Từ man 3 exec: "Nếu bất kỳ hàm exec () nào trả về, sẽ xảy ra lỗi. Giá trị trả về là -1 và biến toàn cục errno sẽ được đặt để chỉ ra lỗi."
Ionoclast Brigham

24

Bạn có thể kiểm tra mã nguồn tại đây - https://github.com/mtoyoda/sl , than ôi, không có lựa chọn nào khác ngoài những tài liệu được ghi lại và thật đáng buồn là không có gì thực sự sẽ in tên của các tệp.

Vì vậy, có vẻ như câu trả lời của @ sfyn là câu trả lời đúng.



5
@LegoStormtroopr, thực sự là một vấn đề quan trọng.
Graeme

5
Có thể là lỗi lớn nhất kể từ Heartbleed!

12

Lưu ý rằng câu trả lời của I0b0 chỉ là một bằng chứng slsẽ không bao giờ hiển thị tất cả và chỉ danh sách thư mục hiện tại. Tuy nhiên, có những trường hợp slsẽ hiển thị danh sách thư mục hiện tại cùng với 'thông tin' bổ sung.

Ví dụ: trong một thư mục trống:

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

trên sáu dòng đầu tiên sẽ liệt kê nội dung của thư mục và trên 10 dòng còn lại sẽ thuận tiện tô điểm danh sách này bằng hình ảnh của một chuyến tàu (không có khói).


3
Hoặc, thư mục hiện tại có thể là một tập hợp trống. Trong trường hợp đó, tất cả các tệp (không tồn tại) được hiển thị cùng với hình ảnh của một chuyến tàu. :-)
Kevin Seifert

6

Tôi biết rằng Lego Stormtroopr đã đăng nhập một vé để vấn đề quan trọng có thể được giải quyết. Ai biết được có bao nhiêu thời gian để sửa chữa được triển khai?

Như vậy, tôi đã cung cấp một cách giải quyết để tác động do vấn đề nghiêm trọng được giảm thiểu. Bạn có thể tạo một hàm shell slsẽ thực thi sl:

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

Bây giờ gọi slsẽ, thỉnh thoảng, liệt kê các nội dung thư mục.


2

Nếu bạn đặt bí danh cho nó ls, nó sẽ in thư mục hiện tại - thực tế, một khi tôi ngừng cười với đầu máy xe lửa hơi nước, tôi đã thêm nó vào danh sách bí danh của mình.


1

Bạn luôn có thể tự mình xem lại mã nguồn và bạn sẽ không thấy nó thực hiện lslệnh thực tế cũng như hiển thị các thư mục.

https://github.com/mtoyoda/sl

Nguồn thực sự khá đơn giản. Ngay cả khi bạn "không phải là lập trình viên", bạn vẫn có thể hiểu hầu hết về nó.

Tôi tin rằng "lỗi" mà bạn đã đăng ở trên thực sự chỉ là trong trò đùa (và để gây ra cuộc thảo luận như thế này lol)


1

Có, slsẽ hoạt động giống như ls nếu bạn thiết lập bí danh thích hợp trong bash hoặc bất kỳ shell nào bạn đang sử dụng!

Tôi thực sự có một số bí danh cho ls bao gồm

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

cảm ơn vì lời đề nghị - tôi sẽ thêm

alias sl='ls -FG'

(Không phải là tôi từng nhớ gõ slnhưng sau đó tôi có xu hướng với chúng tôi llhoặc lh!)


-1

Bạn có thể làm như tôi cũng ...

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

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

nano / usr / trò chơi / sl

Dán như sau:

#! / bin / bash

tiếng vang "BẠN ĐÃ GỌI 'sl' INSTEAD OF 'ls'!"

/ usr / trò chơi / sl-old

echo "Đoán tôi có thể liệt kê nó bằng mọi cách ..."

/ thùng / ls

Nhấn CTRL + X để thoát và Y để lưu.

nano / usr / trò chơi / LS

Dán như sau:

#! / bin / bash

tiếng vang "BẠN ĐÃ GỌI 'LS' CÀI ĐẶT 'ls'!"

/ usr / trò chơi / sl-old

echo "Đoán tôi có thể liệt kê nó bằng mọi cách ..."

/ thùng / ls

Nhấn CTRL + X để thoát và Y để lưu.

PS: Bạn được hoan nghênh vì đã phục hồi điều này .. tìm kiếm "lệnh sl linux" vẫn đưa chủ đề này lên, vì vậy tôi nghĩ rằng tôi sẽ đưa ra một câu trả lời thực sự về cách tôi làm cho nó liệt kê các tệp ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.