Kabuk betiği başarısız: Sözdizimi hatası: “(” beklenmeyen


64

Raspberry Pi geliştirme için bir geliştirme ortamı ayarlamayı otomatikleştiren bir komut dosyası üzerinde çalışıyorum (bu işte adım adım detaylar burada ). Komut dosyası bu makalede bağlantılı ancak kolaylık burada da bulabilirsiniz . Şimdi bu betiği çalıştırdığınızda, ortamı kurmak ve hatasız bir şekilde ayarlamak, ancak varsayılan olarak sudo'nun zaman aşımı değeri nedeniyle sudo şifrenizi bir kereden fazla girmeniz gerekir. Böylece tüm sudo satırlarını kaldırarak ve komut dosyasının tamamını sudo üzerinden komut satırında çalıştırarak denemeye başladım:

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

Bu beklendiği gibi çalışıyor ve şu ana kadar yolun çoğunu alıyor:

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

Şimdi bu satır daha önce tüm senaryoyu sudo ile çalıştırmıyorsanız gayet iyi çalışıyordu. Bu hat hakkında sudo olarak çalışan hiçbir şey yok, bildiğim kadarıyla çalışmayı durdurması gereken, herhangi bir fikri olan var mı?


1
Shebang gerçekten 9. hatta mi? Ubuntu'nun DashAsBinSh benzeşimi nedeniyle betiğinizin dashyerine yorumlandığından şüpheleniyorum bash.
Shebang'ı

Bu makaleye göre / bin / sh yerine doğrudan / bin / bash diyerek; doğru bir şekilde bash yerine bash kullanın, böylece anladığım kadarıyla sorun olmamalı. Shebang'ı hala hareket ettirebiliyorum ama bu senaryoyu tamamlamadığınızda neden işe yaradığını açıklamıyor.
kemra102

Benim durumumda her şey yolundaydı ama alışkanlık olarak, kabuk betiğimi "sh" ile değil "sh" ile çalıştırıyordum.
Indrajeet Gour 11:18

Yanıtlar:


82

Senaryo bir shebang çizgisiyle başlamıyor , bu yüzden sistem bunu uygular /bin/sh. Ubuntu'da, yalnızca standart özelliklerle hızlı başlatma ve çalıştırma için tasarlanmış bir kabuk /bin/sholan çizgidir . Çizgi, satır 68'e ulaştığında, bir sözdizimi hatası görür: bu parantez bağlamda kendisine bir şey ifade etmez.

Kısa çizgi (diğer tüm kabuklar gibi) tercüman olduğu için, yürütme sorunlu hatta ulaşana kadar şikayet etmez. Böylece senaryo testinizde bir noktada başarıyla başlasa bile, 68. satıra ulaşıldığında iptal edilmiş olur.

Shebang satırı, dosyadaki ilk şey olmalı. Bash özelliklerini kullandığınız için, dosyanın ilk satırı #!/bin/bashya da olmalıdır #!/usr/bin/env bash.


2
Açıkça bildiğim kadarıyla bilgimdeki bir boşluk, çok fazla bilmiyorum bu yüzden farkında değildim! Açıklama için teşekkürler çok yardımcı oldu ve gelecekte de bilmek çok yararlı olacaktır.
kemra102

Bu hatanın nautilus için betik uzantılarını kullanırken bile meydana geldiğini ekleyeyim. Shebang hattını eklemek hemen çözdü. +1.
Bhavin Doshi,

sonarqube.shUbuntu 15.10'da çalışan sorunla karşı karşıya . Dediği gibi başlık değiştirildi. Çalıştırılıyor sudo sh ./sonar.sh console. Hala hata alıyorum.
soufrk

o @soufrk mı sonarqube.shyoksa sonar.sh? Kararını ver. Her neyse, bu konudaki bilgilerle ilgili problemi çözemezseniz, betiğin içeriği ile ilgili yeni bir soru sorun ve tam hata mesajlarını kopyalayıp yapıştırın.
Gilles

Benim hatam !! Yanlış çalıştırılabilir dosya çalışıyordu. Ancak, ilginç bir şekilde, doğru kemer üzerinde başlayan dosya #! /bin/shmükemmel bir şekilde yürütüldü. Şimdi, bu beni şaşırtıyor.
soufrk

6

Shebang ilk satırda değilse, kök kullanıcının kabuğuna, SHELLdeğişkeni veya -sbayrağına bakılmaksızın saygı duyulmayacaktır. Bunun basit bir örnekle olduğunu kolayca onaylayabilirsiniz:

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

Bu betiğin sudo ile çalıştırılması, Ubuntu ve Debian'ın son sürümlerinde bir sözdizimi hatası doğuracaktır.

Komut dosyasının şu şekilde yorumlandığından emin olmak için iki seçeneğiniz vardır bash:

  1. Shebang'ı ilk satıra taşı

  2. sudoBu şekilde koş :

    sudo bash ./pi_dev_env_install.sh

1

Benim için senaryoyu başlatmak için:

bash ./< script file > 

iyi çalışıyor.


Bu sizin için doğru olabilir, ancak belirtilen soruna gerçekten bir çözüm değildir.
bu5hman

0

Belki dir veya dosya adında bir "(" vardır.


0

Komut dosyasında dos2unix'i deneyin. Bazen bazı gizli karakterler kaynakta bulunur.

komut:

dos2unix script_file.sh script_file.sh

0

Amaçlanan tercümanı geçersiz kılarsanız bu olabilir. Örneğin bu, hangi hash bang kullanıldığına bakılmaksızın sh ile çalışacaktır (hash bang kullanmıyorken kullanışlıdır):

> sh run.sh

VEYA bash çalıştırmak için:

> bash run.sh

Tanımlanmış karma bang değerini kullanarak betiği kullanmasına izin vermek için şunu kullanın:

> ./run.sh

-1
sudo chmod 755 <script>

Benim durumumda hata dosyayı yürütmek için izin eksikliği vardı. Yalnızca komutları ayırdığımda hata mesajını aldım:

$ sudo sh
# ./install

İzinlerin olmaması bu hata mesajına neden olmaz.
Gilles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.