O wyższości Zsh nad Bashem - czy ktoś wie w czym Zsh jest lepszy?

2

Od ponad 10 lat używam Basha na Linuksie i żyło mi się z Bashem całkiem dobrze. Potem w pracy dostałem służbowego macOSa i żyło mi się znośnie. Jednak macOS stwierdził że się z aktualizuje i zamieni domyślną powłokę z basha na zsha. Ja z tym dalej walczę i przełączam się na zsha jednak widziałem że część osób w pracy używa zsha, nie wiem tylko czy się poddali czy jednak zsh jest w czymś lepszy

TLDR Czy ktoś wie w czym jest lepszy zsh od basha że teraz zsh jest domyślną powłoką w macOSie?

5

Ja uzywam zsh ze wzgledu na https://ohmyz.sh/
https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins
https://github.com/ohmyzsh/ohmyzsh/wiki/Themes

EDIT: szczegolnie polecam https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/z ;)


Jest tez kilka innych bajerow w samym zsh jak np. podpowiadanie dostepnych opcji/parametrow po wpisaniu program - [TABULATOR]

stivens@ ~ $ gcc -[tutaj tab]
-###                                          -- print commands to run this compilation
-aux-info                                     -- Emit declaration information into <file>
-B                                            -- Add <prefix> to the compiler's search paths
-c                                            -- Compile and assemble, but do not link
-C                                            -- do not discard comments during preprocess
-CC                                           -- do not discard comments, including macro expans
-dumpbase                                     -- Set the file basename to be used for dumps
-dumpdir                                      -- Set the directory name to be used for dumps
-dumpmachine                                  -- Display the compiler's target processor
-dumpspecs                                    -- Display all of the built in spec strings
-dumpversion                                  -- Display the version of the compiler
-E                                            -- Preprocess only; do not compile, assemble or li
(....)
stivens@ ~ $ gcc -c[tutaj tab]
-c   -- Compile and assemble, but do not link
-C   -- do not discard comments during preprocess
-CC  -- do not discard comments, including macro expansion

Albo wbudowane aliasy, np. ll, la na ls z roznymi opcjami

1

Mi najbardziej się podoba to, że jak niechcący skopiuję jakieś polecenie ze znakiem nowej linii na końcu, to po wklejeniu nie wykona się od razu, tylko czeka na enter. Poza tym trochę lepsze podpowiadanie, łatwiejsza instalacja rozszerzeń/pluginów. Poza tym nie widzę za dużej różnicy w codziennym użytkowaniu.

4

ZSH ma parę ułatwień i ogólnie jest bardziej konfigurowalny niż Bash. Sam używałem go parę lat temu (teraz głównie Fish).

A co do pytania dlaczego macOS przeniósł domyślny shell na ZSH zamiast Basha to powodem nie jest "lepszość" jednego nad drugim (aczkolwiek odnoszę wrażenie, że ZSH i tak było popularniejsze wśród developerów niż Bash), a zwyczajnie powodem jest licencja, gdzie Bash zmienił (bodajże w wersji 5) licencję z GPLv2 na GPLv3, w związku z czym Apple zostało przy starej wersji nie mogąc zrobić aktualizacji. W związku z tym, że wersja była już prehistoryczna, to postanowili przejść na coś "nowszego" z kompatybilną licencją. Wybór tutaj był oczywisty jako, że ZSH i tak było już bardzo popularne na macOSie oraz jest na licencji MIT-like, więc Apple nie musi się tutaj zupełnie przejmować.

0

ZSH nie robi rewolucji względem bash, jeśli już są jakieś ulepszenia, to są drobnostki. Przy pisaniu skryptów do pliku nie będzie większej różnicy. W działaniu (wywołania systemowe, funkcje itp) praktycznie jest tak samo.

0
KamilAdam napisał(a):

TLDR Czy ktoś wie w czym jest lepszy zsh od basha że teraz zsh jest domyślną powłoką w macOSie?

How to change your zsh to bash on macOS
https://www.cyberciti.biz/faq/change-default-shell-to-bash-on-macos-catalina/
Na tym najnowszym macOS nie zadziała?

BTW, to chyba nie różnica między zsh a bash a bash 3.2 i bash 4.4
https://unix.stackexchange.com/questions/3432/what-are-the-new-features-available-to-bash-4/3434

GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
License GPLv3+: GNU GPL version 3 or later
Nie zgłebiam różnic licencji GPL 2 i 3.

Jak dla mnie bez różnicy, zupełnie jak vim

~                              VIM - Vi IMproved                                
~                               version 7.4.8056                                
~                               version 8.0.1453       

Gdyby nie ten temat nie sięgał bym nigdy po --version

2

ohmyzsh jak już ktoś wspomniał, chociaż dla basha jest też ohmybash - w ogóle tych ohmy<costam> jest sporo.

Natomiast, to, na co ja chcę zwrócić uwagę to kompatybilność - bash jest praktycznie wszędzie, zsh jest w 99% z nim zgodny, ale są bardzo drobne niuanse - mnie akurat pogryzły jak coś tam ansiblowałem na hoście z zsh, a na hoście z bash się wykładało (i odwrotnie), znajomi też wpadli w jakieś rzadkie edge cases, ale to incydenty. Mówiąc "wszędzie" mam oczywiście na myśli serwery.

Generalnie przyjąłbym zasadę, aby w skryptach explicite wołać basha jak pod niego się pisało, bo /bin/sh może wskazywać na zsh czasem (lub jeszcze na coś innego) i testować na docelowym shellu. Doładowany bash czy zsh (tymi właśnie ohmy) są generalnie przyjemne w użyciu, zsh wydaje się mieć aktywniejsze community tutaj, więc co kto woli. Nie wskazywałbym co jest generalnie lepsze, bo ciężko tutaj wyrokować.

2

Generalnie jestem zwolennikiem skryptowania pod pełną zgodność z /bin/sh, chyba że skrypt ma być na konkretne, w miarę nowoczesne środowisko, to wtedy można sobie wybrać shell. Ale jak nie, to nie zakładałbym dostępności basha. Resztę i tak z reguły opędzić się da coreutilsami (choć niekoniecznie równie wygodnie co w bashu).
@TurkucPodjadek: mnie pogryzł kiedyś brak basha i fakt, że sh to był faktyczny sh czy coś podobnego do tego oldskulowego sh (na jakimś BSD czy innym "prawdziwym unixie"). No ale kto na produkcji na Solarisie nie wywołał killall proces ten nie wie o czym mówię :D
No i pełna zgoda co do tego, że przy korzystaniu z "bashyzmów" należy tego basha wołać wprost.

Natomiast do użytku interaktywnego używam ZSH z uwagi na parę ułatwień, ale nie zamierzam tu nikogo przekonywać, ot - imho warto spróbować. Ja tak zrobiłem i zostałem.
Natomiast zdecydowanie odradzam csh/tcsh, to jest pomiot dziwki i Szatana. Ani w tym skryptować, ani interaktywnie tego używać. Najgorsze że na BSD chyba jest nadal defaultem ;)

0
hauleth napisał(a):

ZSH ma parę ułatwień i ogólnie jest bardziej konfigurowalny niż Bash. Sam używałem go parę lat temu (teraz głównie Fish).

A co do pytania dlaczego macOS przeniósł domyślny shell na ZSH zamiast Basha to powodem nie jest "lepszość" jednego nad drugim (aczkolwiek odnoszę wrażenie, że ZSH i tak było popularniejsze wśród developerów niż Bash), a zwyczajnie powodem jest licencja, gdzie Bash zmienił (bodajże w wersji 5) licencję z GPLv2 na GPLv3, w związku z czym Apple zostało przy starej wersji nie mogąc zrobić aktualizacji. W związku z tym, że wersja była już prehistoryczna, to postanowili przejść na coś "nowszego" z kompatybilną licencją. Wybór tutaj był oczywisty jako, że ZSH i tak było już bardzo popularne na macOSie oraz jest na licencji MIT-like, więc Apple nie musi się tutaj zupełnie przejmować.

I dobrze że w terminalu ( tak, macOS ma terminal ) jest zsh. Bash za bardzo zalatuje własnościowym kodem. Poza tym zawsze można zmienić na bash jak chcesz.....

2

nie zapominajmy o fish ;)

0

@TurkucPodjadek: Screenshot 2020-12-04 at 21.03.34.png

5

Do fish raczej nic nie ma doskoku w tym momencie. To jeśli byś chciał mieć najlepsze narzędzie ;) Obrazek poniżej pokazuje do czego mi potrzebna konfiguracja zsh+ohmyzsh+powerlevel9k+ dodatkowe czcionki. Wbudowane aliasy jak ll. Wyświetlanie brancha i rewizji na którym jest repo. Podświetlanie plików nie będących pod kontrolą wersji. Uzupełnianie przy wpisywaniu jak widać na dole. Nie wiem na ile się to da zrobić w bash ale w fish bym się tego spodziewał.
screenshot-20201207154304.png

1

Zainspirowany kombajnem wyżej @lsikora: wziąłem coś dla siebie. Co mi najczęściej robi pod górkę? Pomyłki w którym branch siedzę.

Dla zwykłego bash mikro dodatek do prompt'a

poszukanie gdzie definiowany jest prompt (znalazł w pliku .bash_profile)

$ cd ~ && grep "PS1=" .* 2>/dev/null

zwraca

.bash_profile:export PS1="\W $ "

przed definicją prompt

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

i zamiana prompt z/na

export PS1="\u@\h \W $ "
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

Albo od razu mini-prompt, tylko bieżący katalog

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

Przeładowanie bash

source ~/.bash_profile

Ot teraz wejścia w jakiś folder zainicjowany jako git repo spowoduje uzupełnienie prompt o info o aktualnym git branch
Po wyjściu z folderu git-repo niepotrzebne info o branch nie jest wyświetlane

~ $ cd project/
project (master) $ 

Mała rzecz, został ten sam stary dobry bash, a od dziś mnie cieszy

1

Mój shell w Fishu:

Zrzut ekranu 2020-12-9 o 21.26.43.png

Do pobrania: https://github.com/hauleth/agnoster

1

@BraVolt: gratulacje. Właśnie zademonstrowałeś perfekcyjnie po co istnieją takie projekty jak oh-my-zsh - no właśnie po to, aby zamiast Twojej "prostej" instrukcji, ktoś, komu zależy na czasie i 100 innych sprawach, zwyczajnie przekleił 1 komendę z githuba i odpalił nowe okno terminala, po czym miał to samo co zademonstrowałeś + znacznie więcej.

0

tylko PS!

1
TurkucPodjadek napisał(a):

@BraVolt: gratulacje. Właśnie zademonstrowałeś perfekcyjnie po co istnieją takie projekty jak oh-my-zsh - no właśnie po to, aby zamiast Twojej "prostej" instrukcji, ktoś, komu zależy na czasie i 100 innych sprawach, zwyczajnie przekleił 1 komendę z githuba

Chyba rozumiem po co są pisane i dlaczego cieszą się dużą popularnością projekty jak
NPM Add Two Numbers

1

Tak patrzę na poprzednie komentarze i trochę się rozpętała odwieczna debata. Próba odpowiedzenia na pytanie, czy sam sobie może programista/użytkownik powinien dopisać funkcjonalność, czy ma co najwyżej doinstalować program, bibliotekę, moduł, system. Odpowiedź to zawsze "to zależy", od osobistych preferencji.
Ważne jest, by nie popadać w skrajności typu left-pad kontra 40 lat pracy Knutha nad TeX ;)

1
lsikora napisał(a):

trochę się rozpętała odwieczna debata

Popatrzyłem na twój wpis ze zrzutem ekranu i pomyślałem sobie: fajny, ok a co chciałbym mieć od razu u siebie?
Ja to znaczy, zwykły user, który kompa włącza, wyłącza,

uptime
12:48  up 47 days

traktuje jak narzędzie.

Chciałbym mieć prompt z nazwą branch kiedy wchodzę w folder git repo. O to jest to!
Ale nie chcę od razu porzucać bas bo bash mi wystarcza na moje nieduże potrzeby.

Pogooglowałem, zebrałem info, zrobiłem wpis bo sam się przy tym drobiazgu czegoś nauczyłem więc może ktoś też skorzysta.
Ściągnąć i doinstalować można wszystko i na pewno nie brałbym się za coś większego, bo inni zrobili to lepiej i poświecili na to dużo czasu. Ale takie drobiazg IMO podpada pod "zrób to sam". Admina takie "wyzwanie" obrazi, dla mnie jest OK.

3

@BraVolt:

Chyba rozumiem po co są pisane i dlaczego cieszą się dużą popularnością projekty jak NPM Add Two Numbers

Nie wiem czy to dobre porównanie, w sensie biblioteki robiące to samo, co jedno wyrażenie w danym języku.

Twój manerw w bashu może i działa, ale spędziłeś nad tym więcej czasu niżbyś użył z pakietu oh-my-zsh (przykładowo). Do tego, te "frameworki" nazwijmy to, używa w cholerę ludzi, sporo w nich wpadło w jakieś edge cases, zgłosili issue lub zrobili PR. Więc biorąc taki "framework", masz dopracowany i przetestowany przez wiele osób na świecie. Robiąc sam, masz jedynie satysfakcje, że to Ty, ale pewnie niejednego edge case złapiesz i będzie poprawiać i spędzać coraz więcej czasu na "dopieszczaniu", zamiast po prostu używać coś, co jest dobre i sprawdzone. Kto co woli.

1
TurkucPodjadek napisał(a):

Więc biorąc taki "framework", masz [...]

Ale ja tylko zmieniałem prompta

W bash, bez instalacji czegoś innego

1 użytkowników online, w tym zalogowanych: 0, gości: 1