Lo script della shell non riesce: errore di sintassi: “(” imprevisto


64

Ho lavorato su uno script che automatizza la configurazione di un ambiente di sviluppo per lo sviluppo di Raspberry Pi (i dettagli passo passo che funzionano sono qui ). Lo script è collegato in quell'articolo, ma per praticità puoi trovarlo anche qui . Ora quando esegui questo script installa e configura l'ambiente senza errori ma devi inserire la tua password sudo più di una volta a causa del valore di timeout di sudo per impostazione predefinita. Quindi ho iniziato a sperimentare rimuovendo tutte le righe sudo ed eseguendo l'intero script tramite sudo dalla riga di comando in questo modo:

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

Funziona bene come previsto e arriva fino a questo punto:

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

Ora questa riga ha funzionato bene in precedenza quando non si esegue l'intero script con sudo. Non c'è nulla in questa linea in esecuzione come sudo che dovrebbe impedirgli di funzionare a mia conoscenza, qualcuno ha qualche idea?


1
Lo shebang è davvero in linea 9? A causa dell'affinità DashAsBinSh di Ubuntu sospetto che il tuo script sia interpretato dashinvece di bash. Prova a spostare lo shebang nella riga 1.
manatwork

Secondo quell'articolo chiamando direttamente / bin / bash invece di / bin / sh will; usare correttamente bash invece di trattino in modo che non dovrebbe essere un problema come ho capito. Posso ancora spostare lo shebang ovviamente, ma questo non spiega davvero perché funzioni quando non si sudo l'intero script.
kemra102,

Nel mio caso tutto andava bene ma, come abitudine, stavo eseguendo il mio script shell con "sh" non con "bash".
Indrajeet Gour,

Risposte:


82

Lo script non inizia con una riga shebang , quindi il sistema lo esegue /bin/sh. Su Ubuntu, /bin/shè dash , una shell progettata per l'avvio e l'esecuzione veloci con solo funzionalità standard. Quando il trattino raggiunge la linea 68, vede un errore di sintassi: quella parentesi non significa nulla nel contesto.

Poiché dash (come tutte le altre shell) è un interprete, non si lamenterà fino a quando l'esecuzione non raggiungerà la linea problematica. Pertanto, anche se lo script è stato avviato correttamente a un certo punto del test, si sarebbe interrotto una volta raggiunta la riga 68.

La linea shebang deve essere la prima cosa nel file. Dato che usi le funzionalità bash, la prima riga del file deve essere #!/bin/basho #!/usr/bin/env bash.


2
Grazie chiaramente un vuoto nella mia conoscenza, non scrivo molto, quindi non ne ero a conoscenza! Grazie per la spiegazione è stato di grande aiuto e sarà molto utile sapere anche in futuro.
kemra102,

Consentitemi di aggiungere che questo errore si verifica anche durante l'utilizzo dell'estensione degli script per nautilus. L'aggiunta della linea shebang l'ha risolta immediatamente. +1.
Bhavin Doshi,

Di fronte al problema in esecuzione sonarqube.shsu Ubuntu 15.10. Modificato l'intestazione come detto. In esecuzione sudo sh ./sonar.sh console. Ancora visualizzato l'errore.
soufrk,

@soufrk È sonarqube.sho sonar.sh? Decidi. E comunque, se non riesci a risolvere il problema con le informazioni in questo thread, fai una nuova domanda con il contenuto completo dello script e copia e incolla i messaggi di errore completi.
Gilles 'SO- smetti di essere malvagio'

Colpa mia !! Eseguibile arco eseguibile errato. Ma interessante, sull'arco corretto il file che inizia con #! /bin/sheseguito perfettamente. Ora, questo mi lascia perplesso.
soufrk,

6

Se lo shebang non è sulla prima riga, non verrà rispettato, indipendentemente dalla shell dell'utente root, dalla SHELLvariabile o dal -sflag. Puoi facilmente confermare ciò con un semplice esempio:

#
#!/bin/bash
offfset=(`ls`)
echo $offset

L'esecuzione di questo script con sudo genererà un errore di sintassi nelle recenti versioni di Ubuntu e Debian.

Sono disponibili due opzioni per assicurarsi che lo script sia interpretato da bash:

  1. Sposta lo shebang sulla prima riga

  2. Esegui in sudoquesto modo:

    sudo bash ./pi_dev_env_install.sh

1

Per me iniziare lo script con:

bash ./< script file > 

funziona bene.


Questo potrebbe essere vero per te, ma non è davvero una soluzione al problema dichiarato.
Bu5hman,

0

Forse hai un "(" sulla dir o sul nome del file.


0

Prova dos2unix nel file di script. A volte alcuni personaggi nascosti sono presenti nella fonte.

comando:

dos2unix script_file.sh script_file.sh

0

Questo può accadere se si ignora l'interprete previsto. Ad esempio, questo funzionerà con sh indipendentemente dall'hash bang usato (utile quando non si usa l'hash bang):

> sh run.sh

O per eseguire bash:

> bash run.sh

Per lasciarlo usare il valore hash bang definito dallo script, usare questo:

> ./run.sh

-1
sudo chmod 755 <script>

Nel mio caso l'errore era la mancanza di autorizzazioni per eseguire il file. Ho ricevuto il messaggio di errore solo quando ho separato i comandi:

$ sudo sh
# ./install

La mancanza di autorizzazioni non causerebbe questo messaggio di errore.
Gilles 'SO- smetti di essere malvagio' il
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.