GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Mendapatkan Asterisk '*' Di Zsh Untuk Memiliki Perilaku Yang Sama Seperti Bash?

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.

Terkait:Pintasan Keyboard Alias ​​​​ZSH
Linux
  1. Bagaimana Cara Men-debug Skrip Bash?

  2. Bagaimana Cara Mendapatkan Penyelesaian Bash Untuk Alias ​​​​Perintah?

  3. Bagaimana Cara Mendapatkan Tipe Data Variabel Di Zsh?

  1. Bagaimana Agar Type-ahead Terapkan Ke Bash History Search (ctrl-r)?

  2. Bagaimana Cara Mendeteksi Bash>=4.0?

  3. Bagaimana Cara Mendapatkan Tty Di Bash Yang Sedang Berjalan?

  1. Bagaimana saya bisa mendapatkan nilai unik dari array di Bash?

  2. Bagaimana cara mendapatkan direktori absolut dari sebuah file di bash?

  3. Bagaimana cara mendapatkan persentase penggunaan prosesor dengan bash?