เชลล์สคริปต์ล้มเหลว: ข้อผิดพลาดทางไวยากรณ์:“ (” ไม่คาดคิด


64

ฉันทำงานกับสคริปต์ที่ตั้งค่าสภาพแวดล้อมการพัฒนาโดยอัตโนมัติสำหรับการพัฒนา Raspberry Pi (รายละเอียดทีละขั้นตอนที่ทำงานอยู่ที่นี่ ) สคริปต์ที่มีการเชื่อมโยงในบทความนั้น แต่ความสะดวกของคุณสามารถค้นหาได้ที่นี่ยัง ตอนนี้เมื่อรันสคริปต์นี้ติดตั้งและตั้งค่าสภาพแวดล้อมโดยไม่มีข้อผิดพลาด แต่คุณต้องป้อนรหัสผ่าน sudo ของคุณมากกว่าหนึ่งครั้งเนื่องจากค่าการหมดเวลาของ sudo โดยค่าเริ่มต้น ดังนั้นฉันเริ่มทดลองโดยลบบรรทัด sudo ทั้งหมดและรันสคริปต์ทั้งหมดผ่าน sudo ที่บรรทัดคำสั่งดังนี้:

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

วิธีนี้ใช้งานได้ตามที่คาดหวังและได้รับประโยชน์สูงสุดจนถึงจุดนี้:

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

ตอนนี้บรรทัดนี้ใช้งานได้ดีก่อนหน้านี้เมื่อไม่ได้เรียกใช้สคริปต์ทั้งหมดด้วย sudo ไม่มีอะไรเกี่ยวกับบรรทัดนี้ที่ทำงานเหมือน sudo ที่ควรหยุดทำงานกับความรู้ของฉันไม่มีใครมีความคิดบ้างไหม?


1
shebang อยู่ในสาย 9 จริงหรือ เนื่องจากของ Ubuntu DashAsBinShความสัมพันธ์ฉันสงสัยว่าสคริปต์ของคุณจะถูกตีความโดยแทนdash bashพยายามเคลื่อนย้าย shebang ในบรรทัดที่ 1
จัดการ

อ้างอิงจากบทความที่เรียก / bin / bash โดยตรงแทนที่จะเป็น / bin / sh จะ; ใช้ bash อย่างถูกต้องแทนที่จะเป็น dash เพื่อไม่ให้เกิดปัญหาตามที่ฉันเข้าใจ ฉันยังคงสามารถย้าย shebang ของหลักสูตร แต่ไม่ได้อธิบายว่าทำไมมันทำงานเมื่อคุณไม่ sudo สคริปต์ทั้งหมด
kemra102

ในกรณีของฉันทุกอย่างเรียบร้อย แต่เป็นนิสัยฉันใช้งานเชลล์สคริปต์ด้วย "sh" ไม่ใช่ด้วย "bash"
Indrajeet Gour

คำตอบ:


82

สคริปต์ไม่ได้เริ่มต้นด้วยการshebang/bin/shบรรทัดเพื่อให้ระบบดำเนินการกับ บน Ubuntu /bin/shคือเส้นประซึ่งเป็นเชลล์ที่ออกแบบมาเพื่อการเริ่มต้นและการทำงานที่รวดเร็วพร้อมกับคุณสมบัติมาตรฐานเท่านั้น เมื่อขีดมาถึงบรรทัดที่ 68 จะพบข้อผิดพลาดทางไวยากรณ์: วงเล็บนั้นไม่ได้มีความหมายอะไรกับมันในบริบท

เนื่องจากเส้นประ (เหมือนกับเชลล์อื่น ๆ ทั้งหมด) เป็นล่ามมันจะไม่บ่นจนกว่าการประมวลผลจะถึงบรรทัดที่มีปัญหา ดังนั้นแม้ว่าสคริปต์จะเริ่มต้นได้สำเร็จในบางจุดในการทดสอบของคุณสคริปต์จะถูกยกเลิกเมื่อถึงบรรทัดที่ 68

บรรทัด shebang ต้องเป็นสิ่งแรกในไฟล์ เนื่องจากคุณใช้คุณลักษณะทุบตีบรรทัดแรกของไฟล์ต้องหรือ#!/bin/bash#!/usr/bin/env bash


2
ขอบคุณช่องว่างที่ชัดเจนในความรู้ของฉันฉันไม่ได้เขียนสคริปต์มากดังนั้นจึงไม่ได้ตระหนักถึงสิ่งนั้น ขอบคุณสำหรับคำอธิบายมันช่วยได้มากและจะมีประโยชน์มากที่จะรู้ในอนาคตเช่นกัน
kemra102

ให้ฉันเพิ่มว่าข้อผิดพลาดนี้เกิดขึ้นแม้ในขณะที่ใช้ส่วนขยายสคริปต์สำหรับหอยโข่ง การเพิ่มบรรทัด shebang แก้ไขได้ทันที +1
Bhavin Doshi

เผชิญกับปัญหาการทำงานsonarqube.shบน Ubuntu 15.10 เปลี่ยนส่วนหัวดังกล่าว sudo sh ./sonar.sh consoleการดำเนินการ ยังคงได้รับข้อผิดพลาด
soufrk

@soufrk มันsonarqube.shหรือsonar.sh? ให้ขึ้นใจของคุณ. และถ้าคุณไม่สามารถแก้ไขปัญหาเกี่ยวกับข้อมูลในชุดข้อความนี้ให้ถามคำถามใหม่พร้อมเนื้อหาทั้งหมดของสคริปต์และคัดลอกข้อความผิดพลาดทั้งหมด
Gilles

ความผิดฉันเอง !! กำลังเรียกใช้งาน arch ที่ไม่ถูกต้อง แต่น่าสนใจที่ไฟล์ที่ถูกต้องไฟล์ที่เริ่มต้นด้วย#! /bin/shการดำเนินการอย่างสมบูรณ์แบบ ตอนนี้ทำให้ฉันงุนงง
soufrk

6

หาก shebang ไม่ได้อยู่ในบรรทัดแรกมันจะไม่ได้รับการเคารพโดยไม่คำนึงถึงเชลล์ของผู้ใช้รูทSHELLตัวแปรหรือ-sแฟล็ก คุณสามารถยืนยันได้อย่างง่ายดายด้วยตัวอย่างง่ายๆ:

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

การรันสคริปต์นี้ด้วย sudo จะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ใน Ubuntu และ Debian เวอร์ชันล่าสุด

คุณมีสองตัวเลือกเพื่อให้แน่ใจว่าสคริปต์ถูกตีความโดยbash:

  1. ย้าย shebang ไปยังบรรทัดแรก

  2. ทำงานsudoแบบนี้:

    sudo bash ./pi_dev_env_install.sh

1

สำหรับฉันเริ่มต้นสคริปต์ด้วย:

bash ./< script file > 

ทำงานได้ดี


นั่นอาจเป็นเรื่องจริงสำหรับคุณ แต่มันไม่ใช่วิธีแก้ปัญหาที่ระบุ
bu5hman


0

ลอง dos2unix ในไฟล์สคริปต์ บางครั้งมีอักขระที่ซ่อนอยู่ในแหล่งที่มา

คำสั่ง:

dos2unix script_file.sh script_file.sh

0

สิ่งนี้สามารถเกิดขึ้นได้หากคุณแทนที่ล่ามที่ต้องการ เช่นนี้จะทำงานกับดวลจุดโทษโดยไม่คำนึงถึงสิ่งที่แฮชปังใช้ (มีประโยชน์เมื่อไม่ใช้แฮชปัง):

> sh run.sh

หรือเพื่อใช้ bash:

> bash run.sh

เพื่อให้มันใช้ค่าแฮชปังที่กำหนดสคริปต์ใช้สิ่งนี้:

> ./run.sh

-1
sudo chmod 755 <script>

ในกรณีของฉันข้อผิดพลาดคือการขาดสิทธิ์ในการดำเนินการไฟล์ ได้รับข้อความแสดงข้อผิดพลาดเฉพาะเมื่อฉันแยกคำสั่ง:

$ sudo sh
# ./install

การไม่มีสิทธิ์จะไม่ทำให้เกิดข้อความแสดงข้อผิดพลาดนี้
Gilles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.