Shell script bị lỗi: Lỗi cú pháp: Tuy nhiên (bất ngờ


64

Tôi đã làm việc với một kịch bản tự động hóa việc thiết lập môi trường phát triển để phát triển Raspberry Pi (từng bước chi tiết hoạt động ở đây ). Kịch bản được liên kết trong bài viết đó nhưng thuận tiện bạn cũng có thể tìm thấy nó ở đây . Bây giờ khi chạy tập lệnh này, cài đặt và thiết lập môi trường không có lỗi nhưng bạn phải nhập mật khẩu sudo của mình nhiều lần do giá trị hết thời gian của sudo theo mặc định. Vì vậy, tôi bắt đầu thử nghiệm bằng cách loại bỏ tất cả các dòng sudo và chạy toàn bộ tập lệnh thông qua sudo tại dòng lệnh như vậy:

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

Điều này hoạt động tốt như mong đợi và được hầu hết các cách cho đến thời điểm này:

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

Bây giờ dòng này hoạt động tốt trước đây khi không chạy toàn bộ tập lệnh với sudo. Không có gì về dòng này chạy như sudo mà nên dừng nó hoạt động theo hiểu biết của tôi, có ai có ý tưởng gì không?


1
Các shebang có thực sự ở dòng 9? Do mối quan hệ DashAsBinSh của Ubuntu, tôi nghi ngờ kịch bản của bạn được giải thích dashthay vì bash. Cố gắng di chuyển
shebang

Theo bài báo đó gọi / bin / bash trực tiếp thay vì / bin / sh sẽ; sử dụng chính xác bash thay vì dấu gạch ngang để không phải là một vấn đề như tôi hiểu. Tôi vẫn có thể di chuyển shebang, nhưng điều đó không thực sự giải thích tại sao nó hoạt động khi bạn không sudo toàn bộ kịch bản.
kemra102

Trong trường hợp của tôi, mọi thứ đều ổn nhưng như một thói quen, tôi đã chạy tập lệnh shell của mình bằng "sh" chứ không phải bằng "bash".
Indrajeet Bầu

Câu trả lời:


82

Kịch bản không bắt đầu bằng một dòng shebang , vì vậy hệ thống thực thi nó với /bin/sh. Trên Ubuntu, /bin/shdấu gạch ngang , một vỏ được thiết kế cho khởi động nhanh chóng và thực hiện với các tính năng chỉ tiêu chuẩn. Khi dấu gạch ngang đạt đến dòng 68, nó sẽ thấy một lỗi cú pháp: dấu ngoặc đơn đó không có nghĩa gì với nó trong ngữ cảnh.

Vì dấu gạch ngang (giống như tất cả các shell khác) là một trình thông dịch, nó sẽ không khiếu nại cho đến khi việc thực thi đạt đến dòng có vấn đề. Vì vậy, ngay cả khi tập lệnh bắt đầu thành công tại một số điểm trong thử nghiệm của bạn, nó sẽ bị hủy bỏ khi đạt đến dòng 68.

Dòng shebang phải là điều đầu tiên trong tập tin. Vì bạn sử dụng các tính năng bash, dòng đầu tiên của tệp phải là #!/bin/bashhoặc #!/usr/bin/env bash.


2
Cảm ơn rõ ràng là một lỗ hổng trong kiến ​​thức của tôi, tôi không viết kịch bản nhiều nên không nhận thức được điều đó! Cảm ơn vì lời giải thích nó đã giúp ích rất nhiều và cũng sẽ rất hữu ích để biết trong tương lai.
kemra102

Hãy để tôi thêm rằng lỗi này xảy ra ngay cả khi sử dụng phần mở rộng tập lệnh cho nautilus. Thêm dòng shebang đã giải quyết nó ngay lập tức. +1.
Bhavin Doshi

Đối mặt với vấn đề chạy sonarqube.shtrên Ubuntu 15.10. Thay đổi tiêu đề như đã nói. Thi công sudo sh ./sonar.sh console. Vẫn nhận được lỗi.
soufrk

@soufrk Là nó sonarqube.shhay sonar.sh? Làm cho tâm trí của bạn. Và dù sao đi nữa, nếu bạn không thể giải quyết vấn đề với thông tin trong chuỗi này, hãy hỏi một câu hỏi mới với toàn bộ nội dung của tập lệnh và sao chép-dán toàn bộ (các) thông báo lỗi.
Gilles 'SO- ngừng trở nên xấu xa'

Lỗi của tôi !! Đã chạy sai vòm thực thi. Nhưng thật thú vị, trên vòm chính xác, tập tin bắt đầu được #! /bin/shthực hiện hoàn hảo. Bây giờ, điều đó làm tôi hoang mang.
soufrk

6

Nếu shebang không nằm trên dòng đầu tiên, nó sẽ không được tôn trọng, bất kể shell của người dùng root, SHELLbiến hay -scờ. Bạn có thể dễ dàng xác nhận điều này bằng một ví dụ đơn giản:

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

Chạy tập lệnh này với sudo sẽ gây ra lỗi cú pháp trong các phiên bản gần đây của Ubuntu và Debian.

Bạn có hai tùy chọn để đảm bảo tập lệnh được diễn giải bởi bash:

  1. Di chuyển shebang đến dòng đầu tiên

  2. Chạy sudonhư thế này:

    sudo bash ./pi_dev_env_install.sh

1

Đối với tôi bắt đầu kịch bản với:

bash ./< script file > 

hoạt động tốt


Điều đó có thể đúng với bạn, nhưng nó không thực sự là một giải pháp cho vấn đề đã nêu.
bu5hman

0

Có thể bạn có một "(" trên thư mục hoặc tên tệp.


0

Hãy thử dos2unix trong tập tin kịch bản. Đôi khi một số nhân vật ẩn có trong nguồn.

chỉ huy:

dos2unix script_file.sh script_file.sh

0

Điều này có thể xảy ra nếu bạn ghi đè trình thông dịch dự định. Ví dụ: điều này sẽ chạy với sh bất kể sử dụng hàm băm nào (tiện dụng khi không sử dụng hàm băm):

> sh run.sh

HOẶC để chạy bash:

> bash run.sh

Để cho phép nó sử dụng tập lệnh băm giá trị băm, hãy sử dụng:

> ./run.sh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.