Apa fungsi tanda bintang sebagai perintah mandiri di Unix?

21

Saya bermain-main di terminal di Red Hat Linux, dan ketika saya mengetik asterisk ( *) diikuti oleh return, dan ia menjalankan salah satu program di direktori saya. Mengapa?

Tebakan terbaik saya adalah bahwa Unix memperlakukannya sebagai wildcard sehingga ia menjalankan program alfabet pertama. Karena my_program.exedan one_of_my_programs.programdapat dieksekusi hanya dengan mengetikkan nama file, operator wildcard mewakili semua file yang mungkin. Karena sebuah program pertama kali berdasarkan abjad, Unix menjalankannya. Apakah ini penilaian yang benar?

pengguna6086585
sumber
Saya pikir tidak semua shell mengurutkan ekspansi *berdasarkan abjad, tetapi bash adalah salah satu yang melakukannya.
aschepler
1
@aschepler: semua shell yang sesuai dengan POSIX harus; lihat pubs.opengroup.org/onlinepubs/9699919799/utilities/... para 3.
dave_thompson_085

Jawaban:

20

Penafsiran Anda benar. Sisa file akan disajikan sebagai daftar parameternya.

Perhatikan bahwa ini hanya akan dilakukan jika program memiliki bit yang dapat dieksekusi, dan direktori saat ini ada dalam PATHdaftar.

Beberapa catatan yang dapat membantu memahami: -

  • Jika Anda mengetik ./*maka PATHentri tersebut bukan keharusan.
  • Jika Anda mengetik . *atau . ./*dan file yang cocok pertama adalah sebuah skrip, maka itu tidak perlu dapat dieksekusi, juga tidak perlu direktori saat ini berada PATH(mungkin tidak berlaku untuk shell selain bash).
AFH
sumber
10
"hanya akan melakukan ini ..." - Ini bisa lebih menarik. Jika ada fungsi shell, builtin, atau yang dapat dieksekusi sebelumnya PATHdengan nama yang sama dengan file pertama maka perintah lain ini akan dieksekusi. mkdir foo; cd foo; touch rm xyz; ls; *; ls.
Kamil Maciorowski
@ KamilMaciorowski - Poin wajar: pernyataan saya "hanya akan melakukan ini ..." menentukan kondisi yang diperlukan , tetapi tidak cukup . Perintah juga akan berperilaku berbeda jika *alias.
AFH
1
Kesimpulan: jangan lakukan ini! Bahkan jika Anda berpikir Anda dapat mengandalkan tatanan alfabet ekspansi glob, perhatikan bahwa pesanan ini tergantung pada lokal.
Aaron
selain . *atau . ./*satu kaleng bash *(atau shell lain).
Olivier Dulac
11

Ini menunjukkan bahwa itu .adalah bagian dari PATHvariabel Anda . Itu adalah ide yang sangat buruk untuk alasan keamanan (tentu saja, Windows harus menjadikannya default yang tidak dapat dimodifikasi).

Namun, "saran" ini hanya valid sedikit: jika Anda memiliki file bernama rmdi direktori Anda saat ini, *akan baik-baik saja mengeksekusi default rm :

/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$ 
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm  what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$ 

Seperti yang Anda lihat, itu tidak ada rmdi direktori saat ini (file kosong dan tidak dapat dieksekusi) yang dieksekusi tetapi lebih dari standar sistem /bin/rm.

Selalu periksa perintah Anda saat wildcard terlibat. Berikut adalah salah satu pesan paling menakutkan yang pernah dibaca:

rm: cannot remove '.o': No such file or directory

Ini adalah hasil dari panggilan

rm * .o

, kurang lebih penempatan terburuk dari ruang palsu yang bisa muncul.


sumber
1
Tidak ada salahnya untuk membuat fungsi rm()yang menambah -iparameter atau memeriksa parameter dan meminta konfirmasi jika ada lebih dari jumlah tertentu.
AFH
3
+1 untuk "Ini adalah salah satu pesan paling menakutkan yang pernah dibaca".
Mehrdad
+1 untuk "Itu adalah ide yang sangat buruk untuk alasan keamanan (tentu saja, Windows harus menjadikannya default yang tidak dapat dimodifikasi)."
Duncan X Simpson
FTFY: mv /tmp/ohno /tmp/ohnoes( google.fr/search?q=ohnoes&source=lnms&tbm=isch )
Olivier Dulac
Ada alasan bagus mengapa Windows menjadikannya default yang tidak dapat dimodifikasi. Itu harus mempertahankan rantai kompatibilitas mundur dari hari-hari sebelum DOS menerapkan direktori. Ingatlah saat itu tidak ada orang yang menggunakan PC memiliki hard disk, dan floppy disk cukup kecil sehingga direktori pada awalnya dianggap tidak perlu.
Muzer