Czy wszystkie skrypty bash są kompatybilne z `zsh`?

63

Chcę przejść z bash na zsh, ale martwi mnie kompatybilność skryptów bash.

Czy wszystkie skrypty / funkcje bash są kompatybilne z zsh? Dlatego jeśli to prawda, czy Zsh jest tylko ulepszeniem bash?

chrisjlee
źródło
Znalazłem to przydatne: askubuntu.com/questions/1577/moving-from-bash-to-zsh
chrisjlee

Odpowiedzi:

55

Jeśli twoje skrypty zaczynają się od linii #!/bin/bash, nadal będą uruchamiane przy użyciu bash, nawet jeśli domyślną powłoką jest zsh.

Znalazłem składnię zsh bardzo zbliżoną do składni bash i nie zwracałem uwagi, jeśli naprawdę były jakieś niezgodności. 6 lat temu bezproblemowo przełączyłem się z bash na zsh.

Huygens
źródło
1
Jaka była Twoja najtrudniejsza część przejścia?
chrisjlee
4
Żaden. Moje osobiste skrypty dodają odpowiednie odniesienie do bash i na początek znalazłem dobre .zshrc. Zsh i bash były na tyle podobne, że nie uważałem tego za wyzwanie.
Huygens
4
czy możesz wymienić swoje .zshrc:)
neaumusic
Ale jeśli wiersz #!/bin/bashzostanie zignorowany, jeśli uruchomisz plik skryptu, taki jak source ./script.sh?
LCB,
3
Hardg kodowanie ścieżki do powłoki jest złą radą, nawet jeśli jest to często wykonywane. Powinieneś użyć #!/usr/bin/env bashzamiast tego, szczególnie na macOS, gdzie domyślna wersja bash jest poważnie przestarzała, a nowe wersje praktycznie zawsze są instalowane w innej ścieżce.
Konrad Rudolph
29

Zsh może uruchamiać większość skryptów Bourne, POSIX lub ksh88, jeśli ustawisz go we właściwym trybie emulacji ( emulate shlub emulate ksh). Nie obsługuje wszystkich funkcji bash ani ksh93. Zsh ma większość funkcji bash, ale w wielu przypadkach ma inną składnię.

Powłoka, której używasz interaktywnie, nie ma znaczenia dla żadnego skryptu, który masz. Powłoka, która uruchamia skrypty, to ta wskazana w pierwszym wierszu, linii shebang . Na przykład, jeśli skrypt zaczyna się od #!/bin/bash, zostanie wykonany przez bash.

Jeśli dostosowałeś bash, nie będziesz mógł po prostu zmienić jego nazwy .bashrcna .zshrc. Niektóre rzeczy mogą być współużytkowane, na przykład aliasy i funkcje, o ile trzymasz się przecięcia między dwiema powłokami (przecięcie jest zbliżone do ksh88 i pdksh ). Inne rzeczy, takie jak szybkie ustawienia, funkcje uzupełniania i większość opcji, będą musiały zostać całkowicie przepisane.

Jeśli piszesz fragment, z którego ludzie mogą pobierać źródła .bashrclub .zshrcnie chcesz utrzymywać dwóch wersji, trzymaj się wspólnego podzbioru funkcji bash i zsh, który obejmuje większość funkcji programowania bash. Umieść cały kod w funkcjach i umieść następujący wiersz na górze każdej funkcji:

if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi

Możesz użyć emulate shzamiast emulate kshbyć bliżej zwykłej składni sh, co jest potrzebne .profile.

Jeśli funkcja wywołuje inną funkcję, druga dziedziczy ustawienie emulacji, więc nie trzeba umieszczać tej linii w funkcjach wewnętrznych, tylko w funkcjach wywoływanych przez użytkownika końcowego.

Gilles
źródło
1
Używana powłoka nie ma znaczenia, jeśli uruchamiasz skrypty jako ./my_script.sh. source my_script.shi . my_script.shuruchomi go jako bieżącą powłokę, ignorując wszelkie shebang.
BallpointBen
3

Jeśli shebang jest #!/bin/bashi uruchomisz skrypt, ponieważ ./scriptskrypt zostanie wykonany przez bash. Absolutnie nie ma tutaj problemu.

Jeśli jednak uruchomisz go zsh ./scriptlub uruchom jako źródło . ./scriptw działającej instancji zsh, dość często składnia bash i zsh nie będzie zgodna.

Na przykład, zsh nie podzielone rozbudowy parametrów domyślnie bash ma help polecenie wbudowane, nie ma to read -p promptw zsh (składnia jest bardzo różny odczytu cmd \? Wiersza , arrays start on 1 (not 0) in zsh,poleceń only search for external commands in zsh, or there is no (simple) equivalent to$ {^} `foo (wielka tylko pierwsza litera) w zsh Jest to długa lista (głównie) podobieństw i niektórych różnic .

W niektórych przypadkach zsh może zostać poproszony o emulację innych powłok. W niektórych przypadkach nie jest możliwa wspólna składnia przenośna dla obu powłok (bez użycia aliasów lub funkcji do emulacji przenośnych rozwiązań).

Jednak zsh ma wiele (wiele) rozszerzeń, które ułatwiają interaktywną pracę. Jest to jednocześnie doskonały powód do zmiany i problem:

  1. Pro zsh

    • Bardzo miło jest widzieć opcje składni komend naciskając tabulator.
    • Inną ważną zaletą zsh jest korekcja błędów podczas pisania literówki. Zamiast wyświetlać błąd: polecenie nie zostało znalezione, zsh spróbuje zinterpretować to, co próbowałeś wpisać. zsh zaakceptuje to wejście jako prawidłowe polecenie.
    • Ponadto, zsh ma wiele modyfikatorów rozszerzeń, które pozwalają na szeroki zakres rozwiązań. Like: lista tylko plików: ls *(.)(co jest trudne w przypadku innych powłok). Nawet jeśli patrząc wystarczająco głęboko, odpowiedź staje się również złożona w zsh ( print -rl -- *(/)) .
    • Zaakceptuj matematykę za pomocą pływaków (z pewnymi zastrzeżeniami).
  2. Con zsh:

    • Bash jest domyślną powłoką w wielu innych systemach.
    • Wiele opcji zsh nie pomaga bezpośrednio pisać skryptów kompatybilnych z bash.
    • Może to nawet stać się dużym problemem przy próbie nauki dwóch pocisków jednocześnie.

W końcu to twój wybór i zawsze lubię więcej możliwości.

Izaak
źródło