Vlákno názorů k článku Malé hrátky z řádky od abyssal - Ako prve doporucujem vymenit bash za zsh (chsh...

  • Článek je starý, nové názory již nelze přidávat.
  • 21. 1. 2008 0:44

    abyssal (neregistrovaný)
    Ako prve doporucujem vymenit bash za zsh (chsh -s /bin/zsh) - ma to vsetko co bash plus kopu veci naviac, "naj-cool" featura je asi globbing, napr:
    grep somestring **/* #prehlada rekurzivne vsetky subory vo vsetkych adresaroch ktore nie su skryte
    grep somestring **/*~*.o #pregrepuje vsetky subory ktore nematchuju *.o vo vsetkych podadresaroch
    grep somestring **/*.c(c|pp) #pregrepuje vsetky subory *.cpp a *.cc

    Potom dalej hlavne 'zmv' prikaz (hromadne premenovavanie kde je mozne globovat casti nazvov a pouzit ich znova, pr. "zmv "nazov(*).cpp nazov-nejakypriklad-$1.cpp"), a mnozstvo nastaveni (completion pri jednom tabe, check pri > a >> ci uz subor existuje/neexistuje, pri navrhu doplneni nescrollovanie terminalu...)

    Viz pripadne tunajsi clanok http://www.root.cz/clanky/zuzo-shell/

    Dalej to trebars ma lepsi completion nez bash-completion (vratane cvs, svn, configure, ...) Priklad zshrc (orezany o specificke featury) viz. http://pastebin.com/fc9ef67a
  • 21. 1. 2008 3:15

    TOTEM (neregistrovaný)
    Buď to, a všude kam přijdu si instalovat a měnit shell, kde to nepůjde pracovat mnohem pomaleji než jsem zvyklý a lovit v paměti jak udělat to či ono ve skutečném POSIX prostředí,

    NEBO dělat multiplatformně s normálním shellem jako je Korn či Bash a na všechny ty vaše vychytávky používat standardní příkazy co má človek k ruce - shell, find, rename (rename s plnou podporou regexp místo prasáckých hacků v podobě pseudo-globů v syntaxi jedné jediné aplikace), případne párznakové perl onelinery. Nevidím důvod pro existenci shellu, který je něco mezi Kornem, Midnight commanderem a Emacsem.

    Taky byste měl vědět, že globy jsou jen na základní výběr pár souborů - tu hrůzu, co jste předvedl nepoužijete ani vy v zsh pokaždé. Globování totiž funguje tak, že výsledek shell "doplní na command line" ještě než spustí příkaz, který ty výsledky dostane v environmentu. Když takhle debilně globnete ve větším adresáři nebo nedej Bože rekurzivě, nic se vám nespustí, protože výsledek přeteče max. velikost proces environmentu. To je fajn hlavně ve skriptech, kdy to nevidíte. Proto existuje find, xargs a proto taky nikdo normální nepoužívá zsh.

    Co se týká completition, tak nikdo nepoužívá ani 10% toho co např. bash umí. Vy zjevně taky ne, protože byste vědel, že kromě cvs, svn a configure umí doplňovat neomezené množství příkazů, jejich možných parametrů a i jejich hodnot (např. název fs při mount/umount). To, že vy nepoužíváte ty všude dostupné completition funkce, neznamená, že to není možné. Popravdě, pro Bash existuje mnohem víc doplňovačů než pro zsh. :)

    Dále v zsh není kompatibilní POSIX shell, takže buď můžete psát skripty pro zsh nebo UNIX. Příkladem budiž např. chování naprosto zásadního builtin příkazu "set", nebo proměnná OPTIND.

    Situace je taková, že na plno systémech není ani Bash, natož Zsh. Být vámi, tak se radši naučím pořádně _základy_ práce s shellem (jako je string substituce) a perlem (regexp). Budete stejně rychlý jako se zsh, ale na všech systémech. Ne jen doma na vašem barevném hkgxzubuntu desktopu.
  • 21. 1. 2008 10:57

    czz (neregistrovaný)
    Sam size zsh nepouzivam, ale az sa citim vinne aj za abyssal-a ze si vobec dovolil pouzit nieco ine ako jediny_a_spravny tm shell..

    Vela ludi pouziva vyhradne svoj system, nema problem si tam nainstalovat cokolvek, nevidim dovod, preco by to nemohol byt prave zsh.. Je preto azda nenormalny?

    btw v Ubuntu je by default dash, ak sa nemylim ;)
  • 21. 1. 2008 12:46

    abyssal (neregistrovaný)
    "NEBO dělat multiplatformně s normálním shellem jako je Korn či Bash"

    Z cca 12 strojov kde mam ucet (co si z hlavy spominam), je zsh vsade az na jeden. Btw zsh = ksh + bash + nejake drobnosti

    "Taky byste měl vědět, že globy jsou jen na základní výběr pár souborů"

    Viem jak funguje globbing, je to obmedzene maximalnou dlzkou argumentov pre proces (typicky nieco ako 2^15). Ale vo vacsine pripadov "grep neconeco **/*.cpp" je lepsie ako "find ./ -iname "*.cpp" -exec grep -H neconeco {} ';'" V skriptoch zsh nepouzivam, tam sh/bash (kvoli prenositelnosti) alebo ruby/python/perl (na onelinery hlavne perl). AFAIK bash nema # a ## operatory v globe (regexp ekvivalent * a +).

    "Co se týká completition, tak nikdo nepoužívá ani 10% toho co např. bash umí. "

    I beg to differ. Bash completion som pouzival dlho a zsh completion mi subjektivne pride lepsie (=v kope prikazov, co nemali v bash completion, v zsh maju, ale nepocital som kolko ma ktory).

    Diky za poucenie, citim sa o hodne mudrejsi.
  • 21. 1. 2008 22:12

    Palo (neregistrovaný)
    Ale v tom je ta krasa shelu. Bud pouzilem nieco taketo, pre vela suborov:
    find ./ -iname "*.cpp" -exec grep -H neconeco {} ';'

    Alebo to comu ty hovoris globbing pre mensi pocet suborov:
    grep -H neconeco `find ./ -iname "*.cpp"`

    Vyhodne je ze stale pouzivam tie iste prikazy. A s viac moznostami (napr. find -type d ... co bude asi pre zsh globbing trochu problem).
  • 22. 1. 2008 0:22

    abyssal (neregistrovaný)
    "Ale v tom je ta krasa shelu. Bud pouzilem nieco taketo, pre vela suborov[...]"

    Mne pride zapis **/*.cpp ovela elegantnejsi nez `find ./ -iname "*.cpp"`

    "[...]napr. find -type d"
    Zsh ma tolko featur globbingu, ze ich snad ani autor sam nepozna vsetky ;-)

    Pr.
    ls -d /tmp/generated-*(/) #vypise vsetky adresare z tmp zacinajuce generated-, (/) znamena len adresare
    ls /tmp/generated-*(.) #ako predchadzajuci riadok ale len regular files
    ls /tmp/generated-<14000-40000>(@) #vsetky symlinky v tmp zacinajuce "generated-" potom nasledovane cislom v rozmedzi 14000-40000