GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere l'asterisco "*" in Zsh per avere lo stesso comportamento di Bash?

Di recente sono passato da bash a zsh e ora quando scrivo

ls *

Non elenca semplicemente tutti i file in questa directory, ma mostra un albero di due livelli.

Anche

rm -rf somepath/*

non riesce con l'output zsh: no matches found:

Questo funzionava bene con bash. Qualcuno può aiutarmi a ripristinare questo comportamento?

Ho installato oh-my-zsh.

Risposta accettata:

ls * avrebbe lo stesso effetto in bash. Non importa quale sia la shell, ciò che accade è che la shell prima espande i caratteri jolly, quindi passa il risultato dell'espansione al comando. Ad esempio, supponiamo che la directory corrente contenga quattro voci:due sottodirectory dir1 e dir2 e due file normali file1 e file2 . Quindi la shell espande ls * a ls dir1 dir2 file1 file2 . Il ls comando elenca prima i nomi degli argomenti che sono non directory esistenti, quindi elenca a turno il contenuto di ciascuna directory.

$ ls
dir1  dir2  file1  file2
$ ls -F
dir1/  dir2/  file1  file2
$ ls *
file1  file2

dir1:
…

dir2:
…

Se ls si comportava diversamente in bash, o hai cambiato la configurazione di bash per disattivare le espansioni con caratteri jolly, che la disattiverebbero ovunque, oppure hai cambiato il significato di ls comando per sopprimere l'elenco delle directory, probabilmente con un alias. In particolare, avendo

alias ls='ls -d'

nel tuo ~/.bashrc avrebbe esattamente l'effetto che descrivi. Se è quello che hai fatto, puoi copiare questa riga in ~/.zshrc e avrai lo stesso effetto.

Il fatto che rm -rf somepath/* ha un effetto diverso in bash e zsh quando somepath è una directory vuota è una questione completamente diversa.

In bash, se somepath/* non corrisponde a nessun file, quindi bash lascia il modello di caratteri jolly nel comando, quindi rm vede gli argomenti -rf e somepath/* . rm tenta di eliminare il file chiamato * nella directory somepath e poiché non esiste un file di questo tipo, questo tentativo non riesce. Dato che hai passato l'opzione -f a rm , non si lamenta di un file mancante.

In zsh, per impostazione predefinita, se un carattere jolly non corrisponde a nessun file, zsh lo considera come un errore. Puoi cambiare il modo in cui zsh si comporta disattivando l'opzione nomatch :

setopt no_nomatch

Non lo consiglio perché avere la shell che ti dice quando un carattere jolly non corrisponde è solitamente il comportamento preferibile sulla riga di comando. C'è un modo molto migliore per dire a zsh che in questo caso un elenco vuoto va bene:

rm -rf somepath/*(N)

N è un qualificatore glob che dice di espandersi in un elenco vuoto se il carattere jolly non corrisponde a nessun file.

Correlati:ZSH alias scorciatoie da tastiera
Linux
  1. Come rilevare Bash>=4.0?

  2. Come posso ottenere valori univoci da un array in Bash?

  3. Come ottengo la directory assoluta di un file in bash?

  4. Come ottenere la percentuale di utilizzo del processore con bash?

  5. come ottenere elementi dalla lista in bash?

Come commentare in Bash

Come eseguire uno script Bash

Come ottenere lo stato di uscita un ciclo in bash

Come ottenere la data/ora di creazione del file in Bash/Debian?

Come posso annullare l'impostazione o eliminare una funzione bash?

Come ottenere netmask da bash?