Các tập lệnh Bash sẽ không chạy mà không gõ vào bash tinh trước mặt nó


11

Trên hệ thống trường học của chúng tôi, chúng tôi có thể chạy các file kịch bản mà không cần gõ bashhoặc cshhoặc những gì có bạn mà không thấy gì script type nó được. Tuy nhiên, trên Ubuntu, tôi bắt buộc phải nhập bash script.bash. Điều này luôn cần thiết trong Ubuntu, hay đây là một số cài đặt tôi có thể thay đổi?


1
nó được thiết lập như một tập tin thực thi?
jsologistski

vâng, tập tin có thể thực thi được, đó là lý do tại sao tôi nghĩ nó sẽ tự chạy.
muttley91

1
Bạn gặp lỗi gì khi gõ ./script? Bạn có chắc chắn rằng tập lệnh không bị thay đổi từ trình chỉnh sửa Windows đặt thêm char ở cuối dòng không? Điều đó sẽ phá vỡ dòng đầu tiên chỉ ra rằng tập lệnh phải được thực thi bằng bash.
João Pinto

1
Làm thế nào để bạn bắt đầu nó, và các lỗi là gì?
người dùng không xác định

+1 vì không sử dụng .shcho các tập lệnh bash. Nói chung, phần mở rộng tệp không được sử dụng cho các tập lệnh thực thi trong thế giới UNIX.
nyuszika7h

Câu trả lời:


17
  1. Hãy chắc chắn rằng bạn bắt đầu tập lệnh với ./scripthoặc đường dẫn đầy đủ hoặc bất cứ điều gì. Chỉ scriptcó thể không hoạt động (nó hoạt động nếu thư mục nằm trong $PATH, như /usr/bin), vì trên các hệ thống UNIX, không có thói quen để có thư mục hiện tại trong đường dẫn của bạn (vì lý do bảo mật và rất tốt!)

  2. Hãy chắc chắn rằng tập lệnh có thể thực thi được, ví dụ: chmod +x scriptsẽ làm cho nó có thể thực thi được.

  3. Hãy chắc chắn rằng bạn có #!/bin/bashdòng đầu tiên trong tập lệnh của mình. Ngoài ra, hãy đảm bảo rằng nó không được chỉnh sửa với một loại trình soạn thảo Windows nào đó, vì chúng thường sử dụng "loại DOS" của eol (cuối dòng) khác với UNIX (nếu danh sách kiểm tra ở trên là OK, nhưng bạn đã "xấu" trình thông dịch: không có tệp hoặc thư mục như vậy "hoặc như vậy, ngay cả khi đó là / bin / bash, đây thường là lý do, vì không thể in được - vì vậy bạn thường không thấy nó - \ r sẽ được coi là một phần của đường dẫn của thông dịch viên)

Những người khác đã đề cập: điều quan trọng là phải có /bin/bashnếu bạn sử dụng các tính năng bash, cũng /bin/shđược liên kết với nhau /bin/bash, nhưng bây giờ (theo như tôi nhận thấy) nó được liên kết với nhau dashmà sẽ không cung cấp khả năng tương thích bash, chỉ POSIX sh. Điều này khá quan trọng, thậm chí các phần mềm khá đắt tiền tại công ty chúng tôi có vấn đề này: tập lệnh chứa #!/bin/shdòng đầu tiên nhưng nó cũng phụ thuộc vào chức năng bash.


Vì vậy, tôi sẽ phải chạy nó như vậy: ./script, như tôi đã khám phá. Điều này tốt hơn là phải gõ "bash" mỗi lần, và nó có ý nghĩa. Tôi tin rằng tôi đã biết điều này trước đây, nó chỉ trượt tâm trí của tôi. Ồ tốt, cảm ơn!
muttley91

Về lý thuyết, bạn có thể đặt thư mục làm việc hiện tại vào biến PATH để sau đó bạn có thể sử dụng chỉ "script" thay vì "./script" nhưng tôi cảnh báo bạn: đây thực sự không phải là thói quen trên các hệ thống UNIX và nó có thể là vấn đề bảo mật ! Ngoài ra, ở trường học không có gì hay để học mọi thứ theo cách chưa bao giờ là giải pháp trên các hệ thống UNIX, vì vậy tôi sẽ tránh giải pháp này ...
LGB

1
Hoặc, tốt nhất là, #!/usr/bin/env bashđó là một chút di động.
Sparhawk

4

Đảm bảo dòng đầu tiên của tệp đọc:

#!/bin/bash

Nếu shebang là #!/bin/sh, bạn không nên sử dụng bất kỳ tính năng cụ thể nào của bash, chỉ các tính năng POSIX. Ngay cả khi /bin/shlà một liên kết tượng trưng bash, bash sẽ chạy ở chế độ tương thích POSIX khi chạy dưới dạng sh, vô hiệu hóa một số (nhưng không phải tất cả) các tính năng bash.

Tất nhiên, bạn cũng cần đảm bảo rằng tập lệnh có thể thực thi được.


Không, tôi đặt nó thành bash chỉ vì thói quen.
muttley91

0

Một cách khác, không khuyến khích mạnh mẽ là thêm .vào PATH.

PATH=".:$PATH"

hoặc là

PATH="$PATH:."

Vấn đề với cách tiếp cận này là trong trường hợp trước, bất kỳ lệnh hệ thống nào cũng có thể bị ghi đè bằng các tệp thực thi từ thư mục hiện tại và trong trường hợp sau, các lệnh chưa biết vẫn có thể bị ghi đè.

Hãy xem xét những điều sau đây:

Tập tin: ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

Nhiều khả năng bạn thậm chí sẽ không nhận ra cho đến khi quá muộn.


1
Lựa chọn từ là hơi sai ở đây. Các lệnh sẽ không bị ghi đè. Nếu bạn có một lệnh trong thư mục làm việc hiện tại có cùng tên với một lệnh sống trong các thư mục hệ thống, chẳng echohạn, lệnh trong thư mục của bạn sẽ được sử dụng đơn giản vì thư mục đó được đặt trong PATHbiến trước /bin. Shell chỉ đơn giản là tìm kiếm các lệnh trong các thư mục cụ thể tùy thuộc vào thứ tự của chúng PATHvà không ghi đè / phá hủy bất cứ thứ gì. Nhưng vâng, điều này có ý nghĩa
Sergiy Kolodyazhnyy
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.