Apakah `sl` pernah menampilkan direktori saat ini?

106

Bagi mereka yang keluar dari loop, sladalah alat baris perintah lucu yang dimaksudkan untuk membuat orang tersandung jika mereka salah ketik ls. Ketika diminta mencetak Lokomotif Uap. Sebagai contoh:

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

Namun, di halaman manual untuk sl, itu menyatakan bug berikut:

BUGS
        It rarely shows contents of current directory.

Jadi, pertanyaannya tetap, ada beberapa kondisi, di mana slsebenarnya tidak menunjukkan direktori saat ini?

Braiam
sumber
45
+1 untuk memperkenalkan saya ke utilitas yang sangat berguna yang tidak saya sadari selama beberapa dekade.
devnull
3
@slm Kami sudah memastikannya, jadi saya telah memasukkan bug yang membahas masalah kritis ini: # 9
44
Dikatakan jarang menunjukkan isi direktori. Jadi saya kira maksud mereka jika Anda memiliki file seperti | | | H |__--------------------| [___] | =| |, sl menunjukkannya.
Tn. Lister
3
Tarik Permintaan inc: github.com/mtoyoda/sl/pull/11
asteri
7
Saya telah menjadi sysadmin Unix / Linux selama 14 tahun dan belum pernah mendengar alat luar biasa ini. Sungguh menakjubkan betapa banyak yang harus dipelajari.
Michael Martinez

Jawaban:

183

Sejauh yang saya tahu, satu-satunya kondisi yang slmenunjukkan direktori saat ini adalah ketika Anda salah ketik ls.

sfyn
sumber
8
+1 Humor, tapi saya berharap untuk jawaban yang lebih otoritatif.
37
@LegoStormtroopr - mungkin Anda sedang menunggu LegoEmperor mempertimbangkan?
mikeserv
42
  • Lemma: slmencetak lokomotif uap
  • Lemma: Nama file yang valid tidak boleh mengandung garis miring (meskipun jalur bisa)
  • Lemma: Lokomotif uap berisi garis miring ke depan:

    $ 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
    

Kesimpulan: sltidak pernah menampilkan direktori saat ini. QED.

l0b0
sumber
6
Ini berisi beberapa /es, yang tidak diizinkan dalam nama file Unix.
mtak
2
Jika Anda melakukan, mkdir -p "$(dirname "$(sl)")"Anda bisa melakukannya touch "$(sl)". Tentu saja, Anda mungkin menguji batas OS / FS Anda. Dan bersenang-senang membersihkannya.
Kevin
3
@ Mr.Lister Tentunya itu hanya mungkin terjadi jika filesystem juga memiliki bug di dalamnya untuk memungkinkan file tersebut dibuat. Apakah Anda punya referensi?
l0b0
1
@ VolkerSiegel: Tidak juga. Windows mendukung keduanya /dan \, dan artinya sama.
Konrad Borowski
3
Jika Anda memiliki file bernama H(misalnya), maka slmemang ditampilkan. Hanya saja itu juga menunjukkan banyak hal lainnya. :-)
ShreevatsaR
38

Ini tambalan untuk memperbaiki bug itu :)

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] == '-') {
Ionoclast Brigham
sumber
5
Oh Tuhan. Anda adalah seorang sarjana dan jenius.
1
Kau tahu, aku sebenarnya tidak tahu bagaimana melakukan itu? Saya tidak menggunakan github sendiri kecuali sebagai portal unduhan berbasis web untuk perangkat lunak orang lain. Anda bisa melakukannya jika mau. Saya secara resmi melepaskan semua hak cipta pada kode di atas dan menempatkannya di domain publik.
Ionoclast Brigham
+1, tapi itu tidak sepenuhnya 10% - rand() "Mengembalikan bilangan integral pseudo-acak dalam kisaran antara 0 dan RAND_MAX," yang bergantung pada perpustakaan tetapi mungkin tidak dapat habis oleh 100.
l0b0
1
Secara teknis, fungsi execx () dapat kembali. Dari man 3 exec: "Jika salah satu dari fungsi exec () kembali, kesalahan akan terjadi. Nilai kembali adalah -1, dan variabel global errno akan ditetapkan untuk menunjukkan kesalahan."
Ionoclast Brigham
24

Anda dapat memeriksa kode sumber di sini - https://github.com/mtoyoda/sl , sayangnya tidak ada pilihan lain selain yang didokumentasikan dan sayangnya tidak ada yang benar-benar akan mencetak nama-nama file.

Jadi sepertinya jawaban @ sfyn adalah yang benar.

Graeme
sumber
5
@LegoStormtroopr, memang masalah kritis.
Graeme
5
Mungkin bug terbesar sejak Heartbleed!
12

Perhatikan bahwa jawaban I0b0 hanyalah bukti yang sltidak akan pernah menampilkan semua dan hanya daftar direktori saat ini. Namun, ada beberapa situasi di mana slakan menampilkan daftar direktori saat ini bersama dengan 'informasi' tambahan.

Misalnya, di direktori kosong:

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

akan pada enam baris pertama daftar isi direktori, dan pada 10 baris sisanya akan dengan mudah memperindah daftar ini dengan gambar kereta api (tanpa asap).

JP
sumber
3
Atau, direktori saat ini bisa menjadi set kosong. Dalam hal ini semua file (tidak ada) ditampilkan bersama dengan gambar kereta. :-)
Kevin Seifert
6

Saya tahu bahwa Lego Stormtroopr telah mencatat tiket sehingga masalah kritis dapat diatasi. Siapa yang tahu banyak waktu yang diperlukan untuk memperbaiki agar tidak diluncurkan?

Karena itu, saya telah memberikan solusi agar dampak karena masalah serius diminimalkan. Anda dapat membuat fungsi shell slyang akan menjalankan sl:

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

Sekarang memohon slakan, secara sporadis, daftar isi direktori.

devnull
sumber
2

Jika Anda alias ls, itu akan mencetak direktori saat ini - pada kenyataannya, setelah saya berhenti menertawakan lokomotif mesin uap, saya menambahkan itu ke daftar alias saya.

terutama tipu
sumber
1

Anda selalu dapat meninjau kode sumber untuk diri sendiri, dan Anda akan melihat dalam kondisi apa pun tidak pernah melakukan lsperintah aktual atau menampilkan direktori.

https://github.com/mtoyoda/sl

Sumbernya sebenarnya agak sederhana. Bahkan jika Anda "bukan pembuat kode" Anda harus tetap dapat memahami sebagian besar dari itu.

Saya percaya "bug" yang Anda posting di atas benar-benar hanya bercanda (dan menyebabkan diskusi seperti ini lol)

SnakeDoc
sumber
1

Ya, slakan bertindak seperti ls jika Anda menyiapkan alias yang sesuai di bash atau shell apa pun yang Anda gunakan!

Saya sebenarnya punya beberapa alias untuk ls termasuk

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

jadi terima kasih atas sarannya - saya akan menambahkan

alias sl='ls -FG'

(Bukannya aku pernah ingat mengetik sltapi aku cenderung ke kita llatau lh!)

David MW Powers
sumber
-1

Anda bisa melakukannya seperti saya juga ...

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

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

nano / usr / games / sl

Rekatkan yang berikut ini:

#! / bin / bash

echo "ANDA TIPE 'sl' BUKAN 'ls'!"

/ usr / games / sl-old

gema "Kurasa aku bisa mendaftarkannya ..."

/ bin / ls

Tekan CTRL + X untuk keluar dan Y untuk menyimpan.

nano / usr / games / LS

Rekatkan yang berikut ini:

#! / bin / bash

echo "ANDA TIPE 'LS' BUKAN 'ls'!"

/ usr / games / sl-old

gema "Kurasa aku bisa mendaftarkannya ..."

/ bin / ls

Tekan CTRL + X untuk keluar dan Y untuk menyimpan.

PS: Sama-sama menghidupkan kembali ini .. mencari "sl linux command" masih membawa utas ini, jadi saya pikir saya akan memberikan jawaban nyata bagaimana saya membuat daftar file ...

Thread_Reviver
sumber