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.