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.