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?
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?
Odpowiedzi:
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.
.zshrc
:)
#!/bin/bash
zostanie zignorowany, jeśli uruchomisz plik skryptu, taki jak source ./script.sh
?
#!/usr/bin/env bash
zamiast 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.
Zsh może uruchamiać większość skryptów Bourne, POSIX lub ksh88, jeśli ustawisz go we właściwym trybie emulacji ( emulate sh
lub 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 .bashrc
na .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 .bashrc
lub .zshrc
nie 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 sh
zamiast emulate ksh
być 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.
./my_script.sh
. source my_script.sh
i . my_script.sh
uruchomi go jako bieżącą powłokę, ignorując wszelkie shebang.
Jeśli shebang jest #!/bin/bash
i uruchomisz skrypt, ponieważ ./script
skrypt zostanie wykonany przez bash. Absolutnie nie ma tutaj problemu.
Jeśli jednak uruchomisz go zsh ./script
lub uruchom jako źródło . ./script
w 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 prompt
w 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:
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 -- *(/)
) .Con zsh:
W końcu to twój wybór i zawsze lubię więcej możliwości.