Siapa yang berurusan (menafsirkan) * in
echo *
Apakah gema melihat bintang atau shell merawatnya dan mengembalikan daftar nama file ..
Bagaimana dengan
cp temp temp*
Siapa yang berurusan (menafsirkan) * in
echo *
Apakah gema melihat bintang atau shell merawatnya dan mengembalikan daftar nama file ..
Bagaimana dengan
cp temp temp*
Jawaban:
bash (atau apa pun yang Anda gunakan sebagai shell), adalah hal pertama yang membaca input apa pun, dan akan mulai menafsirkan karakter khusus seperti ?
dan *
. *
akan diperluas ke pertandingan apa pun dalam CWD , yang berarti bahwa tanda bintang diganti dengan pertandingan tersebut.
Dalam kebanyakan kasus, ini cukup maju, tetapi dapat menyebabkan beberapa kasus membingungkan dari waktu ke waktu.
Pertimbangkan yang berikut ini. Direktori memiliki konten ini:
Jika Anda mengetik mv *
sesuatu yang tampaknya aneh terjadi: test3
ada di sana, tetapi sisanya hilang. Meski aneh pada awalnya, masuk akal setelah Anda memahami apa yang sebenarnya dilewati bash mv
. Karena asterisk, bash mengartikan mv *
sebagai mv test test1 test2 test3
, dan ketika saya mendapatkan daftar itu, itu akan menganggap bahwa argumen terakhir adalah tujuan, yang mana semua file akan dipindahkan.
Adapun perintah yang Anda daftarkan:
echo *
bisa berfungsi sebagai orang miskin ls
. Shell akan memperluas tanda bintang ke apa pun yang ada di direktori itu, dan seperti yang saya yakin Anda sudah tahu, echo
secara harfiah hanya akan menggemakan bash apa pun yang diteruskan ke bash sebagai argumen.cp temp temp*
akan berperilaku agak seperti mv
perintah yang saya jelaskan di atas, kecuali hanya ada satu direktori bernama temp, di mana sumber dan nama tujuan sama, yaitu tidak akan melakukan apa-apa.*
bukan ls
. Sebagai contoh, for f in *; do
adalah lebih dapat diandalkan dibandingkan for f in $(ls)
jika nama file mengandung spasi atau karakter gumpal. (Akan tetapi, gagal jika tidak ada file di CWD, jadi Anda perlu memeriksa kasus itu.)
shopt nullglob
.
echo *
trik itu dapat menyelamatkan Anda dalam beberapa kasus.
Seperti yang telah dinyatakan, shell mengembang *
sehingga echo
menerima sebagai argumen apapun shell menemukan di direktori saat ini. Namun, perhatikan bahwa jika ekspansi tidak menghasilkan apa-apa, yaitu dalam kasus itu jika direktori tidak berisi file yang tidak disembunyikan, maka *
dibiarkan tidak berubah dan diteruskan sebagaimana perintah yang dipanggil (kecuali opsi non standar digunakan dengan beberapa shell seperti bash
.) echo *
tidak kemudian akan berperilaku seperti orang miskin ls
karena yang pertama tidak akan mencetak apa-apa sementara yang kedua akan mencetak *
.
Demikian pula, cp /tmp/temp temp*
akan membuat file bernama temp*
di direktori saat ini jika belum ada setidaknya satu file yang namanya dimulai temp
.
Akhirnya, jika Anda ingin *
agar tidak terjadi perubahan apa pun yang terjadi, Anda dapat melindunginya dari ekspansi baik menggunakan tanda kutip tunggal '*'
, tanda kutip ganda "*"
atau garis miring terbalik \*
.
Di Bash, shell berurusan dengannya. Anda melihat bahwa jika Anda bahkan mencoba *
tanpa gema
Catatan- berdasarkan beberapa komentar, saya akan menyarankan ketika menjalankan * ENTER, untuk membuat direktori dan menggunakan perintah sentuh untuk membuat beberapa file, dan pastikan tidak ada satu pun, atau setidaknya pastikan yang pertama secara alfabet, bukan nama skrip atau perintah apa pun di jalur.
$ *
bash: a: command not found
$ echo *
a a.aa a.ab a.b a.htm a.tx
Begitu ls *
juga sedikit klise
Di Windows, *
ditangani oleh perintah, jadi dir *.*
bukan klise.
Catatan - Melihat beberapa komentar, saya akan menambahkan, ada risiko berjalan * kemudian ENTER. Jika Anda memiliki file bernama rm yang pertama dalam daftar direktori, maka itu berbahaya karena apa pun setelah itu akan dihapus. Juga, dan ini lebih kecil kemungkinannya, jika file pertama dalam daftar direktori adalah nama skrip di path, maka itu akan menjalankannya.
rm
, tentu saja.
-rf
? Saya mencoba touch -rf
dan touch \-rf
tetapi tidak membuatnya.
-rf
? (Saya mengerti bahaya dari sebuah file bernama rm dan sebuah file bernama -rf, dan masalah mengetik * dan mendorong masuk ke folder penting, saya tidak berencana untuk melakukan itu)
Shell melakukan beberapa ekspansi sebelum argumen diserahkan ke perintah.
Lihat juga https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion
Tidak khusus untuk bash, lihat http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01