Azzal a hírrel, hogy a Catalina alapértelmezés szerint Zash helyett Bash , I “m sok eredmény megtalálása elmondja nekem a kapcsolót, és hogy ez problémákat okozhat a shell parancsfájlokkal, de még nem ismerem a Zsh-t ahhoz, hogy tudjam, mik lehetnek ezek a problémák.
A shell szkriptjeim valóban nem ez bonyolult, de a Bash-ot csak macOS-on és Linuxon használtam – nulla tapasztalat a Zsh-vel. Tudna-e valaki egyszerű gyakorlati összehasonlítást vagy konkrét botlásokat megismerni, hogy készen állhassak a új héj, amikor a Catalina megjelenik?
Megjegyzések
Válasz
Először néhány fontos dolog:
- Bash nem fog eltűnni . Ha már használja a bash-t, akkor semmi nem változik az Ön számára. Csak annyi változik, hogy a zsh lesz az alapértelmezett bejelentkezési héj az új fiókokhoz, és akkor is kiválaszthatja a bash-t.
- A szkripteket ez nem érinti . Mi változik az interaktív használatra szolgáló héj, vagyis a héj a terminálokban (és néhány egyéb dolog, amely a bejelentkezési héjat használja, például crontabs). Ha van egy szkript egy végrehajtási engedélyekkel rendelkező fájlban, akkor kezdje egy shebang sorral , például
#!/bin/bashvagy#!/bin/shvagy#!/usr/bin/env bash, pontosan úgy fog működni, mint korábban. - A Zsh szintaxisa nem teljesen kompatibilis a bash-val , de bezár. Sok kód tovább fog működni, például tipikus álnevek és funkciók. A fő különbségek az interaktív konfigurációs funkciókban vannak.
Most, feltételezve, hogy fontolóra veszi a váltást A zsh fájlba, amely évek óta lehetséges, íme a fő különbségek, amelyekkel találkozni fog. Ez nem egy teljes felsorolás!
Az interaktív használat főbb különbségei
Konfigurációs fájlok : bash olvas (főleg) .bashrc nem bejelentkezési interaktív héjakban (de a macOS alapértelmezés szerint a terminálokban indít bejelentkezési héjat), .profile vagy a bejelentkezési héjakban, és .inputrc. A Zsh olvas (főleg) .zshrc (minden interaktív héjban) és .zprofile (bejelentkezési héjakban). Ez azt jelenti, hogy egyetlen bash testreszabásod sem lesz érvényes: ezeket át kell adnod. Nem lehet csak átmásolni a fájlokat, mert sok mindenre szükség lesz csípésre.
A kulcskötések teljesen más szintaxist használnak. Bash a .inputrc és a bind beépített segítségével köti össze a kulcsokat a readline parancsok . A Zsh a bindkey beépített segítségével köti össze a kulcsokat a zle widgetekkel . A legtöbb readline parancsnak van zsh megfelelője, de ez nem mindig tökéletes ekvivalencia.
A kulcskötésekről szólva, ha a Vi (m) -t használod terminálon belüli szerkesztőként, de nem parancssori módként a shellben, akkor észreveszed, hogy a zsh alapértelmezés szerint vi szerkesztési módot használ, ha EDITOR vagy VISUAL értéke vi vagy vim A bindkey -e emacs módra vált.
Kérjen : a bash a kérdést (főleg) a következőből állítja be: PS1 , amely a következőt tartalmazza: visszavágó menekülés . A Zsh a kérdést főleg PS1 értékről állítja be, amely a következőt tartalmazza: százalék menekül . A bash” s PROMPT_COMMAND funkciói itt érhetők el: zsh a precmd és kampós funkciók . A Zsh több kényelmi mechanizmussal rendelkezik a divatos felszólítások létrehozásához, beleértve a gyors téma mechanizmust .
Az alap parancssori előzmények mechanizmusok (navigálás a felfelé / lefelé , a Ctrl + billentyűkombinációval R , a történelem bővítése !! és barátaival, az utolsó argumentum felidézése a Alt + gombbal. vagy $_) ugyanúgy működnek, de a részletekben nagyon sok különbség van, túl sok ahhoz, hogy ide soroljam. Másolhatja a .bash_history fájlt a .zsh_history fájlba, ha nem módosított egy fájlformátumot megváltoztató shell opciót.
Befejezés : Mindkét shell alapértelmezetten egy alap befejezési mód, amely többnyire kiegészíti a parancsok és fájlok nevét, és átkapcsol egy képzeletbeli módra beleértve a bash_completion -t a bash-on, vagy a compinit futtatásával a zsh-ben. Megtalál néhány olyan parancsot, amelyet a bash jobban kezel, és olyanokat, amelyeket a zsh jobban kezel. A Zsh általában pontosabb, de néha feladja, ahol a bash olyasmit tesz, ami nem helyes, de ésszerű. A parancs lehetséges kiegészítésének megadásához a zsh-nek három mechanizmusa van:
- A „régi” befejezési mechanizmus
compctl-vel, amelyről megfeledkezhet. - A „ új ”befejezési mechanizmus
compaddés sok függvénnyel, amelyek aláhúzással kezdődnek és egy hatékony, de összetett felhasználói konfigurációs mechanizmus . - emuláció támogassa a bash befejezési funkciókat , amelyeket a
bashcompinitfuttatásával engedélyezhet. Az emuláció nem 100% tökéletes, de általában működik.
Sok bash “s shopt beállítás megfelelő setopt a zsh fájlban.
Zsh doe sn “t # kezelése alapértelmezés szerint a parancssorban kezdődő megjegyzésként, csak szkriptekként (beleértve a .zshrc és így tovább). Az interaktív megjegyzések engedélyezéséhez futtassa a setopt interactive_comments futtatást.
A szkriptek főbb különbségei
(és természetesen az energiafelhasználók számára a parancssorban)
A bash-ban a $foo a foo, szétválasztja a szóköz karaktereknél, és ha a szóközökkel elválasztott részek helyettesítő karaktereket tartalmaznak, és egy meglévő fájlhoz illeszkednek, akkor a mintát a találatok listájával helyettesíti. Ahhoz, hogy egyszerűen megkapja a foo értékét, szüksége van a "$foo" fájlra. Ugyanez vonatkozik a $(foo) parancsok helyettesítésére. A zsh-ben a $foo a foo és $(foo) értéke a foo mínusz a végső új sorokkal, két kivétellel. Ha egy szó üres lesz az üres, nem idézett változók kibővítése miatt, akkor eltávolításra kerül (pl. a=; b=; printf "%s\n" one "$a$b" three $a$b five one, egy üres sort, three, five). A nem idézett parancs-helyettesítés eredménye fel van osztva a szóközzel, de a darabok nem kerülnek helyettesítő karakterekre.
A ash tömbök 0-tól (hossz-1) vannak indexelve. A Zsh tömböket 1-től hosszúságig indexelik. a=(one two three) esetén a bash-ban a ${a[1]} two, de zsh-ben “s” one. Ha a bash-ban csak egy zárójel nélküli tömb változóra hivatkozunk, akkor megkapjuk az első elemet, pl. $a one és a $a[1] one[1].Az zsh fájlban a $a kibővül a nem üres elemek listájára, a $a[1] pedig az első elemre. Hasonlóképpen, a bash-ban egy tömb hossza ${#a}; ez zsh-ben is működik, de egyszerűbben $#a néven írhatja. A 0 indexelést alapértelmezetté teheti a setopt ksh_arrays paranccsal; ez bekapcsolja azt a követelményt is, hogy zárójeleket használjon egy tömb elemre történő hivatkozásra.
A Bash-nek extra helyettesítő karakterminták , például @(foo|bar), hogy megfeleljenek a foo vagy bar, amelyek csak shopt -s extglob esetén engedélyezettek. A zsh-ben engedélyezheti ezeket a mintákat a setopt ksh_glob paranccsal, de van egy egyszerűbb típus is div id = “d9ca365ab8”>
natív szintaxis , például(foo|bar), amelyek némelyikéhezsetopt extended_globszükséges (do tegye ezt a.zshrcfájlba, és alapértelmezés szerint be van kapcsolva a befejezési függvényekben). A rekurzív könyvtár bejárása**/mindig engedélyezve van a zsh-ben.
A bash-ban alapértelmezés szerint, ha a helyettesítőminta nem felel meg egyetlen fájlnak sem, akkor balra marad változatlan. A zsh fájlban alapértelmezés szerint “hibaüzenetet kap, amely általában a legbiztonságosabb beállítás. Ha helyettesítő karaktert szeretne átadni egy parancsnak, használjon idézőjeleket. A bash viselkedésre a setopt no_nomatch . A setopt null_glob .
A bash-ban a csővezeték jobb oldala alhéjban fut. Az zsh-ben a szülőhéjban fut, tehát írhat ilyeneket: somecommand | read output.
Néhány szép zsh funkció
Íme néhány olyan jó zsh funkció, amelyek a bash-nak nincsenek ( legalábbis komoly könyökzsír nélkül). Még egyszer: ez csak egy válogatás azok közül, amelyeket a leghasznosabbnak tartok.
Glob selejtezők lehetővé teszi a fájlok egyeztetését olyan metaadatok alapján, mint az időbélyeg, a méret stb. Ezek lehetővé teszik a kimenet módosítását is. A szintaxis meglehetősen rejtélyes, de rendkívül kényelmes. Íme néhány példa:
-
foo*(.): csak afoo*és szimbolikus hivatkozások szokásos fájlokra, nem könyvtárakra és egyéb speciális fájlokra. -
foo*(*.): csak a (z)foo*. -
foo*(-.): csak afoo*-nek megfelelő rendes fájlok, nem a szimbolikus linkek és egyéb speciális fájlok. -
foo*(-@): csak afoo*-nek megfelelő, lógó szimbolikus linkek. -
foo*(om): a (z)foo*fájlnak megfelelő fájlok, a legutóbbi módosítás dátuma szerint rendezve, először a legutóbbi. Vegye figyelembe, hogy ha ezt átadja als, akkor saját rendezését végzi. Ez különösen hasznos… -
foo*(om[1,10]): a 10 legfrissebb fájl, amely megfelel afoo*fájlnak, a legfrissebb először. -
foo*(Lm+1): afoo*fájlnak megfelelő fájlok, amelyek mérete legalább 1 MB. -
foo*(N): ugyanaz, mint afoo*, de ha ez nem felel meg egyetlen fájlnak sem, akkor készítsen üres listát anull_globopció beállításának (lásd fent). -
*(D): illesszen be minden fájlt, beleértve a pontfájlokat is ( kivéve.és..). -
foo/bar/*(:t)(egy előzmények módosítója ): afoo/barfájlok, de csak a fájl alapnevével. Pl. ha van afoo/bar/qux.txt, akkorqux.txtnéven bővül. -
foo/bar/*(.:r): vegyen rendszeres fájlokat afoo/baralá, és távolítsa el a kiterjesztést. Például. Afoo/bar/qux.txtkiterjesztésefoo/bar/qux. -
foo*.odt(e\""REPLY=$REPLY:r.pdf"\"): A (z)foo*.odtfájlnak megfelelő fájlok listája, és cserélje le a.odtszöveget.pdfkifejezésre (függetlenül attól, hogy a PDF fájl létezik).
Íme néhány hasznos zsh-specifikus helyettesítő karakterminta .
-
foo*.txt~foobar*: mind.txtfájlok, amelyek nevefoobetűvel kezdődik, de nemfoobar. -
image<->.jpg(n): minden.jpgfájl, amelynek alapneveimage, amelyet egy szám követ, pl.image3.jpgésimage22.jpg, de nemimage-backup.jpg. A globális minősítő(n)miatt a fájlok numerikus sorrendbe kerülnek, vagyis aimage9.jpgaimage10.jpg(eztnélkül is megteheti alapértelmezettként a setopt numeric_glob_sort).
A fájlok tömeges átnevezéséhez a zsh nagyon kényelmes eszköz: a zmv függvény . Javasolt a következőhöz: .zshrc:
autoload zmv alias zcp="zmv -C" zln="zmv -L"
Példa:
zmv "(*).jpeg" "$1.jpg" zmv "(*)-backup.(*)" "backups/$1.$2"
A Bash-nek van néhány módja a transzformációk alkalmazására egy változó értékének felvételekor . A Zsh-nek van ugyanaz és még sok más .
A Zsh számos kevés kényelmi funkcióval rendelkezik a könyvtárak megváltoztatásához . Kapcsolja be a setopt auto_cd parancsot, hogy könyvtárra váltson, amikor annak nevét írja be anélkül, hogy be kellene írnia a cd (manapság a bashnak is van ilyen). Használhatja a két argumentumú űrlapot cd használatával olyan könyvtárra váltáshoz, amelynek neve közel áll az aktuális könyvtárhoz . Például, ha “div div = = 31d8817296”> be van kapcsolva, és a /some/where/foo-new/deeply/nested/inside helyre szeretne lépni, írja be a következőt: cd old new.
Egy változó értékének hozzárendeléséhez természetesen a következőt írja: VARIABLE=VALUE. A szerkesztéshez a változó értéke interaktív módon, futtassa csak a vared VARIABLE futtatást.
Végső tanács
A Zsh egy konfigurációs felülettel rendelkezik, amely támogatja a néhány leggyakoribb beállítást, beleértve a konzerves recepteket olyan dolgokhoz, mint a kis- és nagybetűk nélküli befejezés. (az első sorra nincs szükség, ha olyan konfigurációs fájlt használ, amelyet a zsh-newuser-install szerkesztett):
autoload -U zsh-newuser-install zsh-newuser-install
Kiszerelésben, konfigurációs fájl nélkül, sok zsh hasznos funkció le van tiltva az 1990-es verziókkal való visszafelé való kompatibilitás érdekében. A zsh-newuser-install javasol néhány ajánlott funkciót a bekapcsoláshoz.
Számos zsh konfigurációs keret található az interneten (sok közülük a Githubon ). Kényelmes módja lehet az indulásnak néhány hatékony funkcióval. Az érme másik oldala az, hogy gyakran bezárnak a dolgokba, ahogy a szerző teszi, ezért néha megakadályozzák, hogy a dolgokat úgy csináld, ahogyan szeretnéd. Használd saját felelősségedre.
A zsh kézikönyv sok információt tartalmaz, de gyakran oly módon írják, hogy szűk és nehezen követhető legyen, és kevés példája van. Ne habozzon, keressen magyarázatot és példát az interneten: ha csak a zsh, amit a kézikönyvben könnyű megérteni, akkor hiányozni fog. Két jó erőforrás: a zsh-felhasználók levelezőlistája és Unix Stack Exchange . átfogó cikkgyűjtemény a zsh-re való áttérésről a mac-on megtalálható a scriptingosx.com oldalon, és hasznos Ruby szkript a parancsok előzményeinek magával hozásához megtalálható a Github oldalon.
Megjegyzések
- Most ‘ kíváncsi vagyok, vajon a csodálatos ctrl-o működik-e a zsh-n. Természetesen ‘ nem működik Mac OS rendszeren sem a bash-on, tehát ‘ nem igazán releváns sem a válasz, sem a webhely szempontjából. Nem tudtam ‘ megtalálni semmilyen információt a ctrl-o-ról a zsh-ben egy gyors online keresés során, de megint a bash-ban lévő ctrl-o-ra vonatkozó információk szintén általánosan pontatlanok …
- @Jasper nem tudtam ‘, hogy bash-nak van ilyen. A leírás szerint Co ugyanezt csinálja zsh-ben az alapértelmezett kulcs-összerendelésekkel.
- Örömmel tapasztaltam, hogy belefoglalta a ” néhány szép zsh-funkciót ” részt, és aggódva olvassa el, hogy megpróbálja megérteni, miért dönthetett az Apple, miért vált át a rendkívül elterjedt Bash-ról a sokkal kevésbé népszerű Zsh-re. Nem találtam ‘ semmit, még távolról is kényszerítőt a váltás igazolására. ‘ nyilvánvalóan nem teljes körű lista, de azért hagytad ki a Zsh fő jellemzőit, mert azok ‘ nyilvánvalóak? Mit hiányolok itt?
- @CodyGray nem tudom ‘ nem tudom, és az Apple nem szokott ‘ lenni hogy igazolják magukat. Valami köze lehetett ahhoz, hogy ha a helyzet megfordult volna, akkor nem lett volna „div bash features” rész „’.Vagy annak lehet az oka, hogy az utolsó nem GPLv3 bash nagyon megöregszik , míg a zsh-nek liberálisabb licence van.
- Megértésem szerint ez volt lényegében az engedélyezés volt az egyetlen ok. ‘ az is, hogy a basOS a macOS-on továbbra is v3. Az utcán az a hír, hogy a bash nem fog frissülni ‘ és várhatóan eltávolításra kerül, hacsak a végfelhasználó nem telepíti brew-on keresztül, stb. A zsh előbb-utóbb MacOS esetén, de egyelőre ragaszkodik a Debianhoz.
Válasz
Változás a shelled most és tesztelj – nem kell várni.
chsh -s /bin/zsh
- Az összes szkript, amely a
basha szintaxis továbbra is megtalálja és meghívja a bash-t. - ugyanaz a Mojave-i bash szállítja a Catalinát, és az áttelepített felhasználók megtartják régi héjukat.
- Sok blogban remekül írtak a preferenciafájlok áthelyezéséről – íme egy ilyen – https://scriptingosx.com/2019/06/moving-to-zsh-part-2-configuration-files/
- Armin blogsorozatát megfelelő könyvvé változtatta , körülbelül 22 ezer szóval.
Ezenkívül azt is becsülném, hogy a macOS-felhasználók 95% -a nem használ parancssort, és azoké, akik ezt használják, további 95% -nak nem kell semmit megváltoztatnia, vagy összes. (Inkább azt fogadnám, hogy a héjak létét ismerő 1% -nak 10% -ának mást kell tennie, mint pár sort beillesztenie .dot fájljaiba)
A felszólítás megváltozik, és ha megváltoztatta a felszólítást a bash napon, akkor a zsh fájl megváltoztatásának módja nem nehezebb és nem kevésbé dokumentált, bash.
Az újabb héjak soha nem tudnak leszállni a földről, ha nagyobb tárgyakat törnének meg, vagy fájdalmas alkalmazkodási időszakot okoznának. Ha egy alapvető változásra vágysz, és valóban héjra vágysz, akkor gondolkodnod kell rajta, és képzettségre, valamint örökbefogadásra van szükséged – próbálj halat .
Megjegyzések
- Összeütközök a
fishvel. Két éve használom, de egyes másolatok / beillesztett egysorok összeférhetetlensége fárasztó. Másrészt nagyon hasznos shell (az automatikus javaslatok < kbd > Tab < / kbd > kiválóak) - szerettem volna szeretni a halakat, továbbra is a halakat szeretem, de túl sok héjszerkezetem van egy évtizedből
ksh-ban, hogy valaha valóban elhagyja ezt a hajtást. Örömmel hagyom hátra a bash-t, és személyesen átfogom a zsh-t. - Alaposan elárasztottak a halak. Ez valójában csak egy újabb Unix-szerű héj, egy kicsit kevesebb Cruft-tal. (Szó szerint azt mondja, hogy ” Végül egy parancssori héj a 90-es évek ” számára a kezdőlapon.) Az egyetlen új héj, amely Az elmúlt években láttam, hogy valójában valami újat hozott a (mainstream) táblázatba, a PowerShell volt, amely sajnos túl sokáig volt a Windows-ra korlátozva, és még mindig a .NET-re korlátozódik. Még mindig nincs olyan sok újdonság a PowerShellben, amely még ‘ még nem történt volna meg pl. a DCL-ben vagy a JCL-ben, de ezt (kissé) ízlésesen megtették.
- @bmike Akkor miért nem csak a ksh-t használja? Az Apple szállítja a legfrissebb verziót. Magam, én már régen megdöbbentem a bash-t, és semmi okot nem látok arra, hogy most elkezdjem használni a zsh-t.
- Ez a válasz egyáltalán nem írja le a bash és a zsh közötti különbségeket … és én ‘ nem vagyok egészen biztos abban, miért adhatom meg, hogy ” a macOS felhasználók 95% -a ne ‘ t használja a ” parancssort egy olyan felhasználó kérdése szempontjából, amely nyilvánvalóan használja a bash-ot.
Válasz
A shell szkriptjeim nem igazán olyan bonyolultak
A shell szkriptjei tartalmaznak shebang sorokat (#! /bin/bash vagy hasonló szavakkal kezdődnek)? Ha nem, akkor véletlenül használhatott egy bash szolgáltatást, ahol szkripteket futtat egy basebet használó shebang nélkül. Más héjak, például a kötőjel vagy a zsh, meghagyják az operációs rendszernek, amely általában a /bin/sh parancsot használja. A /bin/sh a macOS-on, és valószínűleg az is marad, a /bin/bash másolata, de a bash végrehajtása okoz ettől eltérő viselkedést. A részletek a Bash kézikönyv, 6.11 Bash POSIX mód . Néhány pont:
- A Bash biztosítja, hogy a
POSIXLY_CORRECTváltozó be legyen állítva.
Ez a környezeti változó számos más eszköz viselkedését befolyásolhatja, különösen, ha GNU eszközök vannak telepítve.
- A folyamat helyettesítése nem érhető el.
A folyamat helyettesítése a <(...) vagy >(...) szintaxis.
- A
.éssourcebeépített fájlok nem keresik meg az aktuális könyvtárban a fájlnevet argumentum, ha nem a PATH keresésével találja meg.
Tehát ha a szkript . foo arra számít, hogy a jelenlegi könyvtárban egy foo nevű fájlt fog forrni, amely nem fog működni. Helyette . ./foo t kell tennie.
Amint a számokból kitalálhatja, sok kisebb különbség van a bash viselkedésében POSIX módban. A legjobb, ha a bash-t akarja használni a szkriptjeihez, akkor a legjobb a shebang használata.
Megjegyzések
- Az ellenőrzés során úgy néz ki, hogy a shell szkriptek túlnyomó többségét írtam e, vagy használjon kifejezetten state / bin / bash-t a shebangban (nagyon kevés közülük) vagy state / bin / sh-t (majdnem mindegyiket), hogy legalább ne legyen kérdés. Köszönöm.
- Úgy gondolom, hogy a folyamat helyettesítése már elérhető. A Catalinán is sikeresen kipróbáltam. Lásd: zsh.sourceforge.net/Intro/intro_7.html
- @Siu továbbra is nyert ‘ t olyan szkriptek segítenek, amelyek a
/bin/shvagy a/bin/bashparancsot használják a shebangban. A Zsh csak az alapértelmezett interaktív shell, nem ‘ nem cserélte le a bash-t mindenhol - @muru Ah, megértem. Nem olvastam figyelmesen a választ, és úgy gondoltam, hogy a szerző a folyamat helyettesítéséről beszél, a
zsh😅
válaszban nem érhető el
A dolgok egyszerűségének szellemében …
Tudna valaki egyszerű gyakorlati megoldást nyújtani összehasonlítás vagy konkrét botlások, amelyeket tudnom kell, hogy elkezdhessek dolgozni azon, hogy készen álljak az új héjra, amikor a Catalina kiadásra kerül?
Ha az új alapértelmezett shell használatával gondolkodik, vegye figyelembe:
- Ha örvényt akar adni a Zsh-nek, és érzi a különbségeket anélkül, hogy megváltoztatná a gép shell-beállításait, akkor: kipróbálhatja a Powerline10k-t egy Docker-tartályban , és megnézheti, hogy ez a teáscsészéje.
- Ha nincs szüksége az összes harangra és fütyül, és a Bash-t használja csak az alapvető szkriptekhez, meglehetősen könnyű beállítani a héját, ahogyan mások itt kifejtették. És ha úgy dönt, szeretné használni a funkciókat a Bash 5-ben , ez meglehetősen triviális frissítést jelent a macOS számára .
- Ha javítani akarja a szkriptek hordozhatóságát, hogy azok nagyobb valószínűséggel működjenek a várakozásoknak megfelelően, mindkét számban, tesztelje őket POSIX-megfelelőség szempontjából és távolítson el minden “basizmust”. “ ShellCheck -et használtam erre, és a kevésbé bonyolult szkripteknél is nagyon jól működik.
Bár egyetlen út sem tiszta ennek a három megközelítésnek kellő önbizalmat kell biztosítania ahhoz, hogy megalapozott döntést hozzon anélkül, hogy a problémát vagy a megoldási teret jobban át kellene gondolnia.
bash version 3.2.57(1)használatával: Tudja, hogy az Apple használja-e abashbármi ” fontos ” a rendszeren?