Lỗi trình thông dịch xấu khi thực thi tập lệnh shell với dòng shebang chính xác


4

Khi thực thi tập lệnh từ đường dẫn (tên tập lệnh, thay vì "tập lệnh sh") tôi nhận được lỗi sau:

-bash: ./gitup: / bin / bash /: trình thông dịch xấu: Không phải là một thư mục

Tất cả các tập lệnh khác trong cùng thư mục đều thực thi mà không gặp sự cố và tôi không gặp phải vấn đề này khi tập lệnh được thực thi thủ công (sh scriptname), chỉ khi được thực thi bởi chính nó. Vì vậy, tập lệnh dường như không phải là vấn đề vì nó thực thi bình thường và đã làm như vậy cho đến khi tôi mở một phiên shell mới và chỉ gặp phải lỗi này cho tập lệnh này.

Kịch bản có thể thực thi được, bao gồm tất cả các dòng cần thiết để thực thi theo cách tôi đã mô tả (nó hoạt động đúng cho đến trước ngày hôm nay) và có thể được thực thi bởi người dùng của tôi, vì vậy tôi không chắc vấn đề có thể xảy ra.

Dòng shebang đọc #! / Bin / bash. Tôi đã sử dụng lệnh "export PATH = $ PATH: repos / Utility" để chuyển đến thư mục lưu trữ các tập lệnh này, tất cả, ngoài cái này, thực thi đơn giản bằng cách gọi tên tập lệnh (tức là gitup).


3
Bạn có thể vui lòng bao gồm ít nhất là dòng đầu tiên ( dòng shebang ) của tập lệnh của bạn và lệnh bạn sử dụng để gọi nó không? Bạn nói nó ở trong đường dẫn của bạn, nhưng bạn gọi nó với ./gitup. Bạn có chắc là bạn đang chạy tập lệnh mà bạn nghĩ là bạn không?
terdon

Câu trả lời:


2

Có một vài điều tôi có thể nghĩ ra.

  1. Bạn nói rằng tập lệnh của bạn nằm trong $ PATH của bạn, nhưng bạn gọi nó với đường dẫn đầy đủ của nó ( ./gituptrái ngược với chỉ gitup). Có thể là bạn đã chỉnh sửa một phiên bản của tập lệnh (phiên bản trong $ PATH của bạn ~/bin/gitup) và sau đó đã thực hiện một phiên bản khác ( ./gitup)?

  2. Có thể có nhiều phiên bản trong $ PATH của bạn không? Bạn có thể kiểm tra với

    which -a gitup
    
  3. Bạn có thể đã vô tình nhập một nhân vật vô hình kỳ lạ trong khi chỉnh sửa tập lệnh. Kiểm tra dòng shebang bằng cách sử dụng od:

    head -1 ./gitup | od -c
    

    Hãy chắc chắn rằng không có gì sau #!/bin/bashtrừ ký tự dòng mới ( \n). Nó sẽ giống như thế này:

    0000000   #   !   /   b   i   n   /   b   a   s   h  \n
    0000014
    

Cảm ơn bạn. Có vẻ như có nhiều đường dẫn đến cùng một kịch bản.
tony_perkis666

Tôi cũng thấy điều này khi hệ thống tập tin trở nên buồn cười. Tôi có thể đọc các tập tin ok. Cố gắng di chuyển hoặc đổi tên tập tin. Nếu bạn thấy lỗi "Xử lý tệp cũ" thì đây là vấn đề của bạn.
gaoithe

@gaoithe xử lý tập tin cũ là một lỗi hoàn toàn khác nhau thường liên quan đến các giá trị inode không còn hợp lệ. Tôi không thấy nó liên quan ở đây như thế nào.
terdon

@terdon nó có liên quan vì "/ bin / bash /: trình thông dịch xấu:" chính xác là lỗi tôi gặp phải khi chạy tập lệnh. Tôi có thể đọc kịch bản. Tôi có thể mèo nó. Quyền nhìn ổn. Tôi không thể chạy nó. Nếu tôi sao chép tập lệnh sang tên mới thì nó chạy tốt. Khi tôi cố gắng mv hoặc rm tệp, tôi thấy "Xử lý tệp cũ" Tôi đặt trải nghiệm của mình ở đây: stackoverflow.com/questions/2841593/bash-script-bad-interpreter/
trộm

1
@gaoithe huh, thật thú vị. Nếu bạn thấy điều đó một lần nữa, sẽ thật tuyệt nếu bạn có thể đăng câu hỏi về nó, ở đây hoặc trên Unix & Linux . Tôi thấy điều đó rất đáng ngạc nhiên và tôi tự hỏi làm thế nào nó có thể xảy ra. Có lẽ một cái gì đó để làm với thực tế là nó đã ở trong một container docker? Kì lạ
terdon

1

Kiểm tra dòng shebang ( #!), đảm bảo rằng nó nói

#!/bin/bash

và không

#!/bin/bash/

Nếu nó trông giống như ví dụ thứ hai, thay đổi nó thành ví dụ đầu tiên.

EDIT (phản hồi bình luận này )

Nếu điều này chỉ giới hạn ở một tập lệnh, hãy tạo một bản sao của tập lệnh này và bắt đầu xóa mã khỏi tập lệnh đó và tạo một tập lệnh tối thiểu vẫn hiển thị vấn đề này. Sau đó đăng kịch bản tối thiểu đó.


Tôi đã nghĩ rằng lúc đầu và xác minh nó đang sử dụng: #! / Bin / bash, đó là lý do tại sao tôi rất bối rối vì điều này.
tony_perkis666

@josephmarhee Là /bin/bashmột liên kết đến /bin/bash/? Có /bin/bashtồn tại? Hệ thống của bạn có được cập nhật (một lỗi lạ) không?
BenjiWiebe

Nó dường như không được liên kết với nhau, nhưng / bin / bash không tồn tại; điều này dường như chỉ giới hạn trong một kịch bản, nhưng dường như không có vấn đề gì trong kịch bản. Tôi sẽ chạy một bản cập nhật và xem những gì đến của nó. Cảm ơn.
tony_perkis666

@josephmarhee Xem bản chỉnh sửa của tôi
BenjiWiebe

Cảm ơn bạn. Tôi sẽ lộn xộn với kịch bản và xem những gì đến của nó. Có khả năng một cái gì đó ở đâu đó đã được chỉnh sửa tại một số điểm, vì vậy hy vọng nó là điều đó.
tony_perkis666
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.