GNU/Linux >> Znalost Linux >  >> Linux

Jak dosáhnout toho, aby hvězdička „*“ v Zsh měla stejné chování jako Bash?

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.

Související:Klávesové zkratky ZSH Aliases
Linux
  1. Jak ladit Bash skript?

  2. Jak získat dokončování bash pro aliasy příkazů?

  3. Jak získat datový typ proměnných v Zsh?

  1. Jak nechat typ-ahead použít pro vyhledávání v historii Bash (ctrl-r)?

  2. Jak zjistit Bash>=4.0?

  3. Jak získat Tty ve kterém Bash běží?

  1. Jak nulovat číselné proměnné v zsh (a možná také bash?)

  2. Jak mohu získat jedinečné hodnoty z pole v Bash?

  3. Jak získat stav ukončení smyčky v bash