Nedávno jsem přešel z bash na zsh a teď, když píšu
ls *
Neuvádí jednoduše seznam všech souborů v tomto adresáři, ale zobrazuje strom dvou úrovní.
Také
rm -rf somepath/*
selže s výstupem zsh: no matches found:
Kdysi to s bashem fungovalo dobře. Může mi někdo pomoci obnovit toto chování?
Mám nainstalovaný oh-my-zsh.
Přijatá odpověď:
ls * bude mít stejný účinek v bash. Bez ohledu na to, jaký je shell, stane se, že shell nejprve rozbalí zástupné znaky a poté předá výsledek rozbalení příkazu. Předpokládejme například, že aktuální adresář obsahuje čtyři položky:dva podadresáře dir1 a dir2 a dva běžné soubory file1 a file2 . Potom se shell rozšíří ls * na ls dir1 dir2 file1 file2 . ls příkaz nejprve vypíše názvy argumentů, které jsou existujícími neadresáři, a poté postupně vypíše obsah každého adresáře.
$ ls
dir1 dir2 file1 file2
$ ls -F
dir1/ dir2/ file1 file2
$ ls *
file1 file2
dir1:
…
dir2:
…
Pokud ls se v bash chovaly jinak, buď jste změnili konfiguraci bash tak, aby byly vypnuty expanze zástupných znaků, což by je vypnulo všude, nebo jste změnili význam ls příkaz k potlačení výpisu adresářů, pravděpodobně s aliasem. Konkrétně mít
alias ls='ls -d'
ve vašem ~/.bashrc bude mít přesně ten účinek, který popisujete. Pokud jste to udělali, můžete tento řádek zkopírovat do ~/.zshrc a budete mít stejný efekt.
Skutečnost, že rm -rf somepath/* má jiný účinek v bash a zsh, když somepath je prázdný adresář je úplně jiná věc.
V bash, pokud somepath/* neodpovídá žádným souborům, pak bash ponechá vzor zástupných znaků v příkazu, takže rm vidí argumenty -rf a somepath/* . rm pokusí se smazat soubor s názvem * v adresáři somepath a protože žádný takový soubor neexistuje, tento pokus selže. Protože jste prošli volbou -f do rm , nestěžuje si na chybějící soubor.
Ve výchozím nastavení v zsh, pokud zástupný znak neodpovídá žádnému souboru, zsh to považuje za chybu. Chování zsh můžete změnit vypnutím možnosti nomatch :
setopt no_nomatch
Nedoporučuji to, protože nechat shell upozornit, když zástupný znak nesouhlasí, je obvykle preferované chování na příkazovém řádku. Existuje mnohem lepší způsob, jak sdělit zsh, že v tomto případě je prázdný seznam v pořádku:
rm -rf somepath/*(N)
N je kvalifikátor glob, který říká, že se má expandovat na prázdný seznam, pokud zástupný znak neodpovídá žádnému souboru.