Skrip Shell gagal: Kesalahan sintaks: "(" tidak terduga

64

Saya telah mengerjakan naskah yang mengotomatiskan pengaturan lingkungan pengembangan untuk pengembangan Raspberry Pi (detail langkah demi langkah yang berfungsi ada di sini ). Script ini ditautkan dalam artikel tersebut tetapi Anda juga dapat menemukannya di sini . Sekarang ketika menjalankan skrip ini instal dan atur lingkungan tanpa kesalahan tetapi Anda harus memasukkan kata sandi sudo Anda lebih dari sekali karena nilai batas waktu sudo secara default. Jadi saya mulai bereksperimen dengan menghapus semua baris sudo dan menjalankan seluruh skrip via sudo di baris perintah seperti:

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

Ini berfungsi dengan baik seperti yang diharapkan dan mendapatkan sebagian besar jalan sampai titik ini:

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

Sekarang baris ini bekerja dengan baik sebelumnya ketika tidak menjalankan seluruh skrip dengan sudo. Tidak ada yang berjalan di baris ini sebagai sudo yang seharusnya berhenti bekerja sesuai pengetahuan saya, apakah ada yang punya ide?

kemra102
sumber
1
Shebang benar-benar di jalur 9? Karena afinitas DashAsBinSh Ubuntu, saya menduga skrip Anda ditafsirkan dashsebagai ganti bash. Cobalah untuk memindahkan shebang di baris 1.
manatwork
Menurut artikel yang memanggil / bin / bash secara langsung, bukan / bin / sh akan; menggunakan bash dengan benar alih-alih tanda hubung agar tidak menjadi masalah seperti yang saya pahami. Saya masih bisa memindahkan shebang tentu saja, tetapi itu tidak benar-benar menjelaskan mengapa itu bekerja ketika Anda tidak sudo seluruh skrip.
kemra102
Dalam kasus saya semuanya baik-baik saja tetapi sebagai kebiasaan, saya menjalankan skrip shell saya dengan "sh" tidak dengan "bash".
Indrajeet Gour

Jawaban:

82

Script tidak dimulai dengan baris shebang , jadi sistem menjalankannya dengan /bin/sh. Di Ubuntu, /bin/shadalah dash , shell yang dirancang untuk startup cepat dan eksekusi dengan hanya fitur standar. Ketika tanda hubung mencapai garis 68, ia melihat kesalahan sintaks: tanda kurung itu tidak berarti apa-apa dalam konteks.

Karena tanda hubung (seperti semua shell lain) adalah juru bahasa, ia tidak akan mengeluh sampai eksekusi mencapai garis yang bermasalah. Jadi, bahkan jika skrip berhasil dimulai pada beberapa titik dalam pengujian Anda, itu akan dibatalkan setelah baris 68 tercapai.

Baris shebang harus menjadi hal pertama dalam file. Karena Anda menggunakan fitur bash, baris pertama file harus #!/bin/bashatau #!/usr/bin/env bash.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Terima kasih jelas celah dalam pengetahuan saya, saya tidak banyak naskah jadi tidak menyadari itu! Terima kasih atas penjelasannya, ini banyak membantu dan akan sangat berguna untuk mengetahui di masa depan juga.
kemra102
Izinkan saya menambahkan bahwa kesalahan ini terjadi bahkan saat menggunakan ekstensi skrip untuk nautilus. Menambahkan garis shebang menyelesaikannya segera. +1.
Bhavin Doshi
Menghadapi masalah yang berjalan sonarqube.shdi Ubuntu 15.10. Mengubah header seperti yang dikatakan. Mengeksekusi sudo sh ./sonar.sh console. Masih mendapatkan kesalahan.
soufrk
@ soufrk Apakah itu sonarqube.shatau sonar.sh? Putuskan. Lagi pula, jika Anda tidak dapat menyelesaikan masalah dengan informasi di utas ini, ajukan pertanyaan baru dengan konten lengkap skrip dan salin-tempel pesan galat lengkap.
Gilles 'SO- stop being evil'
Salahku !! Menjalankan lengkungan yang salah dapat dieksekusi. Namun yang menarik, pada lengkungan yang benar file dimulai dengan #! /bin/shdieksekusi dengan sempurna. Sekarang, itu membuat saya bingung.
soufrk
6

Jika shebang tidak di baris pertama, itu tidak akan dihormati, terlepas dari shell dari pengguna root, SHELLvariabel atau -sbendera. Anda dapat dengan mudah mengonfirmasi ini dengan contoh sederhana:

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

Menjalankan skrip ini dengan sudo akan memunculkan kesalahan sintaksis dalam versi terbaru Ubuntu dan Debian.

Anda memiliki dua opsi untuk memastikan skrip ditafsirkan oleh bash:

  1. Pindahkan shebang ke baris pertama

  2. Jalankan sudoseperti ini:

    sudo bash ./pi_dev_env_install.sh
janos
sumber
1

Bagi saya memulai skrip dengan:

bash ./< script file > 

bekerja dengan baik.

my.coolmac
sumber
Itu mungkin benar bagi Anda, tetapi itu sebenarnya bukan solusi untuk masalah yang disebutkan.
bu5hman
0

Mungkin Anda memiliki "(" pada direktori atau nama file.

mauro
sumber
0

Coba dos2unix dalam file skrip. Kadang-kadang beberapa karakter tersembunyi ada di sumbernya.

perintah:

dos2unix script_file.sh script_file.sh
M Sarfraz
sumber
0

Ini bisa terjadi jika Anda mengganti penerjemah yang dimaksud. Misalnya ini akan dijalankan dengan sh, apa pun hash bang yang digunakan (berguna saat tidak menggunakan hash bang):

> sh run.sh

ATAU untuk menjalankan bash:

> bash run.sh

Untuk membiarkannya menggunakan nilai hash bang yang ditentukan skrip, gunakan ini:

> ./run.sh
Kc Gibson
sumber
-1
sudo chmod 755 <script>

Dalam kasus saya kesalahannya adalah kurangnya izin untuk mengeksekusi file. Hanya mendapat pesan kesalahan ketika saya memisahkan perintah:

$ sudo sh
# ./install
pengguna145114
sumber
Kurangnya izin tidak akan menyebabkan pesan kesalahan ini.
Gilles 'SANGAT berhenti menjadi jahat'