Tutti gli script bash sono compatibili con `zsh`?


Risposte:


56

Se i tuoi script iniziano con la riga #!/bin/bash, verranno comunque eseguiti usando bash, anche se la shell predefinita è zsh.

Ho trovato la sintassi di zsh molto vicina a quella di bash e non ho prestato attenzione se c'erano davvero alcune incompatibilità. Sono passato 6 anni fa da bash a zsh senza soluzione di continuità.


1
Qual è stata la parte più difficile del passaggio?
chrisjlee,

4
Nessuna. I miei script personali aggiungono il giusto riferimento a bash e avevo trovato un buon .zshrc per cominciare. Zsh e bash erano abbastanza simili che non lo trovavo davvero stimolante.
Huygens,

4
puoi elencare il tuo .zshrc:)
neaumusic

1
Ma se la linea #!/bin/bashverrà ignorata se si esegue il file di script come source ./script.sh?
LCB,

3
La codifica hardg del percorso della shell è un cattivo consiglio, anche se viene eseguita frequentemente. Dovresti #!/usr/bin/env bashinvece usarlo , specialmente su macOS, dove il bash predefinito è gravemente obsoleto e le nuove versioni sono praticamente sempre installate in un percorso diverso.
Konrad Rudolph il

29

Zsh può eseguire la maggior parte degli script Bourne, POSIX o ksh88 se lo si mette nella giusta modalità di emulazione ( emulate sho emulate ksh). Non supporta tutte le funzionalità di bash o ksh93. Zsh ha la maggior parte delle funzionalità di bash, ma in molti casi con una sintassi diversa.

La shell che usi in modo interattivo è irrilevante per qualsiasi script tu abbia. La shell che esegue gli script è quella indicata nella prima riga, la riga shebang . Ad esempio, se lo script inizia con #!/bin/bash, verrà eseguito da bash.

Se hai personalizzato bash, non sarà in grado basta rinominare il tuo .bashrca .zshrc. Alcune cose possono essere condivise, ad esempio alias e funzioni, purché si mantenga l'intersezione tra le due shell (l'intersezione è vicina a ksh88 e pdksh ). Altre cose, come le impostazioni di prompt, le funzioni di completamento e la maggior parte delle opzioni, dovranno essere completamente riscritte.

Se stai scrivendo uno snippet da cui le persone provengono dalla loro .bashrco .zshrce non vuoi mantenere due versioni, segui un sottoinsieme comune di funzionalità bash e zsh, che include la maggior parte delle funzionalità di programmazione di bash. Inserisci il tuo intero codice in funzioni e metti la seguente riga nella parte superiore di ogni funzione:

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

Puoi usare emulate shinvece di emulate kshessere più vicino alla semplice sintassi sh, che è ciò di cui hai bisogno .profile.

Se una funzione chiama un'altra funzione, l'altra funzione eredita l'impostazione di emulazione, quindi non è necessario inserire questa linea nelle funzioni interne, ma solo nelle funzioni chiamate dall'utente finale.


1
La shell che usi è irrilevante se esegui i tuoi script come ./my_script.sh. source my_script.she . my_script.shlo eseguirà come l'attuale shell, ignorando qualsiasi shebang.
BallpointBen,

3

Se lo shebang è #!/bin/bashe si avvia lo script in quanto ./scriptlo script verrà eseguito da bash. Assolutamente nessun problema qui.

Tuttavia, se lo esegui zsh ./scripto lo esegui . ./scriptnell'istanza zsh in esecuzione, è abbastanza comune che la sintassi di bash e zsh non corrisponda.

Ad esempio, zsh non divide le espansioni dei parametri per impostazione predefinita, bash ha un aiuto incorporato, non c'è nessuna read -p promptin zsh (la sintassi è molto diversa leggi cmd \? Prompt , arrays start on 1 (not 0) in zsh,command only search for external commands in zsh, or there is no (simple) equivalent to$ {foo ^} `(maiuscolo solo il primo carattere) in zsh , tra gli altri. Questa è una lunga lista di (principalmente) somiglianze e alcune differenze .

In alcuni casi, si può dire a zsh di emulare altre shell. In alcuni casi, non esiste una sintassi comune portatile per entrambe le shell possibili (senza utilizzare alias o funzioni per emulare soluzioni portatili).

Tuttavia, zsh ha molte (molte) estensioni che facilitano il lavoro interattivo. Questo è allo stesso tempo un ottimo motivo per passare e un problema:

  1. Pro zsh

    • È molto bello poter vedere le opzioni di sintassi dei comandi premendo una scheda.
    • Un altro grande vantaggio di zsh è la correzione degli errori quando si effettua un errore di battitura. Invece di visualizzare solo l'errore: comando non trovato, zsh proverà ad interpretare ciò che hai provato a digitare. zsh accetterà questo input come comando valido.
    • Inoltre, zsh ha molti modificatori di espansioni che consentono una vasta gamma di soluzioni. Come: elenca solo i file: ls *(.)(che è difficile con altre shell). Anche se guardando abbastanza in profondità la risposta diventa anche complessa in zsh ( print -rl -- *(/)) .
    • Accetta la matematica con i float (con alcuni avvertimenti).
  2. Con zsh:

    • Bash è la shell predefinita in molti più sistemi.
    • Molte opzioni di zsh non aiutano direttamente a scrivere script compatibili con bash.
    • Potrebbe persino diventare un grosso problema cercando di imparare due shell contemporaneamente.

Alla fine, è una tua scelta e mi piacciono sempre più scelte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.