Giấy phép Bash Script bị từ chối & Phiên dịch xấu


8

Tôi đang dùng kali linux 64 bit.

Tôi đã tạo một kịch bản python có 2 đối số để bắt đầu. Tôi không muốn gõ ra mỗi lần cùng một đường dẫn hoặc tìm kiếm chính xác trong lịch sử của các lệnh tôi đã sử dụng trong thiết bị đầu cuối. Vì vậy, tôi quyết định tạo ra một kịch bản đơn giản gọi kịch bản python bằng các đối số của nó.

#! /bin bash

python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/

Đây là lệnh chính xác mà tôi sẽ sử dụng trong terminal. Tuy nhiên, tôi nhận được thông báo lỗi khi tôi cố thực thi tệp tập lệnh.

bash: ./wtf.sh: /bin: bad interpreter: Permission denied

wtf.sh có quyền thực thi.

Chuyện gì thế?

Câu trả lời:


10

Bạn có một khoảng trắng thay vì dấu gạch chéo về phía trước:

#! /bin bash

Nên là:

#! /bin/bash

hoặc đơn giản

#!/bin/bash

(không gian đầu tiên là tùy chọn). Shebang ( #!) phải được theo sau bởi đường dẫn đến một tệp thực thi , có thể được theo sau bởi một đối số , ví dụ:

#!/usr/bin/env sh

Trong trường hợp /usr/bin/envnày là thực thi; xem man envđể biết chi tiết.

Chỉ cần /binđề cập đến một thư mục.


chết tiệt, đồ ngốc Cảm ơn! Không thấy điều đó ...
Davlog

1
Bạn có thể muốn tập thói quen sử dụng #!/bin/sh(thay vì #!/bin/bash) trừ khi bạn biết rằng bạn đang sử dụng bashcác tính năng.
G-Man nói 'Phục hồi Monica'

@ G-Man Cảm ơn bạn đã dọn dẹp cái này một chút. Bash WRT so với sh, tôi chỉ theo mô hình từ câu hỏi (mặc dù xu hướng của tôi là chỉ sử dụng shkhi tôi biết tôi không sử dụng các tính năng bash).
goldilocks

Trong thiết bị đầu cuối Ubuntu, which bashlà hữu ích. Điều đó trở lại /bin/bash. Ở đầu tập lệnh Bash của tôi, tôi thêm vào #!/bin/bash. Sau đó, khi tôi muốn chạy tập lệnh Bash, tôi nhập bash foo.sh. Vì vậy, which shđược sử dụng cùng một cách. sh foo.sh
noobninja

1
@ G-Man, trong thế giới công việc, có một số lượng người không may không biết liệu họ có sử dụng các tính năng của Bash hay không. Trong nhiều trường hợp, tốt hơn là không có kịch bản nào chạy (vì Bash được chỉ định trong shebang nhưng bị thiếu) thay vì chạy và làm điều gì đó bất ngờ (vì /bin/shđó là một thứ khác với Bash và có Bashism không được chú ý trong tập lệnh). Xem ở đây.
tự đại diện

1

Điều đáng chú ý là nếu điểm gắn kết mà tập lệnh của bạn cư trú có thuộc tính 'noexec', thì bạn có thể shebang tất cả những gì bạn muốn và nó vẫn không hoạt động, nhưng gọi trình thông dịch với tập lệnh như một đối số sẽ (miễn là đến lượt nó không cố chạy tập lệnh khác trên mount noexec).

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.