Esecuzione di uno script bash da una shell zsh


11

Sto riscontrando problemi nell'esecuzione di uno script bash zsh. Lo script è simile a quello sotto e dovrebbe funzionare sotto bash:

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

Tuttavia, la mia shell è attivata per impostazione predefinita zsh, quindi per eseguire lo script sopra quello che faccio è digitare /bin/bashsul mio zshprompt, quindi eseguo . script.sh.

Tuttavia, questo si traduce in un errore e ottengo:

zsh: no matches found: [0-9]+

(Dovrei ottenere 235234invece).

A questo punto sono confuso e ho le seguenti domande:

  1. Se ci sono bash, perché visualizzo un errore zsh?
  2. Perché il egrepregexp fallisce? L'espressione regolare mi sembra corretta.

Nota: nel caso in cui sia importante, non dovrei modificare lo script (lo script è condiviso da più utenti e non dovremmo modificarlo).

Grazie

Risposte:


19

Se lo script inizia correttamente #!/bin/bash(non puoi avere un altro commento prima di quello), dovresti semplicemente eseguirlo digitando /path/to/script.sh, senza quello .all'inizio. Il .è un'istruzione include, significa “eseguire il contenuto di questo file come se fosse stato digitato qui sulla riga di comando” (questo è chiamato “di sourcing” in unix shell gergo).

L'esecuzione di bash e l'approvvigionamento dello script dovrebbero funzionare. Immagino che, poiché in alcuni casi hai avviato automaticamente bash, ma preferisci zsh, hai impostato bash per passare automaticamente a zsh, magari con exec zshnel tuo ~/.bashrc. Non farlo: invece dovresti passare a zsh nel file che viene eseguito quando accedi, cioè ~/.profilee lasciare .bashrcda solo. Per zshessere eseguito nei terminali, impostare la SHELLvariabile di ambiente:

# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi

È un peccato che non sia possibile modificare lo script, perché è difettoso. Le parentesi dovrebbero essere quotate, anche in bash. Se esiste un file chiamato 3+nella directory corrente, la chiamata a egrepcercherà una o più occorrenze della cifra 3anziché una sequenza di cifre arbitrarie. Se è presente un file chiamato 3+e un file chiamato 4+, la chiamata a egrepcercherà 3i messaggi nel file 4+. Qui, la differenza tra bash e zsh entra in gioco solo quando nessun file corrisponde allo schema fornito: bash esegue silenziosamente il comando con lo schema non sostituito, mentre zsh segnala un errore (per impostazione predefinita).


Grazie @Guilles. Questo è stato molto utile. La cosa strana è che non ho exec zshsul mio ~/.bashrc, né sul mio ~/.profile(non ho nemmeno un .profilesulla mia directory home). Non ricordo come sono riuscito a creare la zshmia shell predefinita. Inoltre, scusate la confusione, ma la prima riga della mia sceneggiatura è lo shebang #!/bin/bash. Con questo, non so ancora perché il sourcing del file zshnon funzioni (se hai qualche idea a riguardo fammi sapere). In entrambi i casi, contatterò l'amministratore per aggiornare lo script per aggiungere virgolette al regexp.
Amelio Vazquez-Reina,

Il problema con l'approvvigionamento in zsh è il secondo argomento egrep.
Ignacio Vazquez-Abrams,
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.