Saya baru saja beralih dari bash ke zsh dan sekarang ketika saya mengetik
ls *
Itu tidak hanya mencantumkan semua file dalam direktori ini, tetapi juga menunjukkan pohon dua tingkat.
Juga
rm -rf somepath/*
gagal dengan output zsh: no matches found:
Ini digunakan untuk bekerja dengan baik dengan bash. Adakah yang bisa membantu saya mengembalikan perilaku ini?
Saya sudah menginstal oh-my-zsh.
Jawaban yang Diterima:
ls *
akan memiliki efek yang sama di bash. Tidak peduli apa shellnya, yang terjadi adalah shell pertama-tama memperluas wildcard, dan kemudian meneruskan hasil ekspansi ke perintah. Misalnya, direktori saat ini berisi empat entri:dua subdirektori dir1
dan dir2
, dan dua file biasa file1
dan file2
. Kemudian shell memperluas ls *
ke ls dir1 dir2 file1 file2
. ls
command pertama-tama mencantumkan nama argumen yang merupakan non-direktori yang ada, kemudian mencantumkan isi setiap direktori secara bergantian.
$ ls
dir1 dir2 file1 file2
$ ls -F
dir1/ dir2/ file1 file2
$ ls *
file1 file2
dir1:
…
dir2:
…
Jika ls
berperilaku berbeda di bash, baik Anda telah mengubah konfigurasi bash untuk mematikan ekspansi wildcard, yang akan menonaktifkannya di mana-mana, atau Anda telah mengubah arti ls
perintah untuk menekan daftar direktori, mungkin dengan alias. Secara khusus, memiliki
alias ls='ls -d'
di ~/.bashrc
. Anda akan memiliki efek yang persis seperti yang Anda gambarkan. Jika itu yang Anda lakukan, Anda dapat menyalin baris ini ke ~/.zshrc
dan Anda akan mendapatkan efek yang sama.
Fakta bahwa rm -rf somepath/*
memiliki efek yang berbeda di bash dan zsh ketika somepath
adalah direktori kosong adalah masalah yang sama sekali berbeda.
Di bash, jika somepath/*
tidak cocok dengan file apa pun, lalu bash meninggalkan pola wildcard di perintah, jadi rm
melihat argumen -rf
dan somepath/*
. rm
mencoba menghapus file bernama *
di direktori somepath
, dan karena tidak ada file seperti itu, upaya ini gagal. Karena Anda melewati opsi -f
ke rm
, itu tidak mengeluh tentang file yang hilang.
Di zsh, secara default, jika wildcard tidak cocok dengan file apa pun, zsh memperlakukan ini sebagai kesalahan. Anda dapat mengubah perilaku zsh dengan menonaktifkan opsi nomatch
:
setopt no_nomatch
Saya tidak merekomendasikan ini karena meminta shell memberi tahu Anda ketika wildcard tidak cocok biasanya merupakan perilaku yang lebih disukai di baris perintah. Ada cara yang jauh lebih baik untuk memberi tahu zsh bahwa dalam kasus ini, daftar kosong tidak masalah:
rm -rf somepath/*(N)
N
adalah qualifier glob yang mengatakan untuk memperluas ke daftar kosong jika wildcard tidak cocok dengan file apa pun.