Điểm:3

Phần mở rộng tệp tập lệnh Bash

lá cờ cn

Tôi có một máy chủ chứa các loại tập lệnh khác nhau.

Các tập lệnh đó sẽ được mở bằng các trình bao khác nhau, chẳng hạn như:

sh ./do_one_thing.sh
bash ./do_another_thing.sh

các .sh tiện ích mở rộng nguy hiểm đối với tôi, đặc biệt nếu tôi không kết nối với máy chủ trong một thời gian dài. Hoặc nếu ai đó không quen thuộc cần thay thế.
tôi có thể vô tình thực hiện sh ./do_another_thing.sh

Nó có tạo ra sự khác biệt nào không nếu tôi đặt tên cho kịch bản của mình do_another_thing.bash? Điều này sẽ tạo ra thêm một lớp bảo mật nữa.

Ngoài ra, tôi muốn biết dòng Shebang ở đầu dùng để làm gì ngoài lời nhắc dành cho Quản trị viên (#!/bin/bash) nếu nó bị ghi đè bởi sh ./do_another_thing.sh dù sao đi nữa. Đối với tôi, có vẻ như phải có một cách phù hợp hơn để thực thi tập lệnh, nhận ra shebang.

Điểm:8
lá cờ ru

Shebang ở đầu tệp xác định trình thông dịch nào được chạy khi bạn chạy ./tên_của_tệp (giả sử nó có thể thực thi được).

#!/bin/mèo
kiểm tra 123

sẽ chỉ in tập tin trên khi bạn chạy nó với ./tên_của_tệp, vì nó sẽ chạy tên_của_tệp mèo.

#!/bin/echo
Chào thế giới

đơn giản là sẽ in tên_của_tệp, bởi vì nó chạy tiếng vang tên_of_file.

Đặt nó thành bash hoặc sh sẽ cho phép bạn chọn trình thông dịch mà nó chạy cùng, miễn là bạn nhớ gọi nó bằng ./tên_của_tệp.

Điều đó đang được nói, sử dụng .sh cho sh, và .bash cho bash hoạt động tốt, albiet không chuẩn. Phần mở rộng tệp khá trôi chảy trên linux.

typecasto avatar
lá cờ ru
@ user68186 Rất tiếc! Đã sửa ngay bây giờ.
paul garrett avatar
lá cờ cx
Không chỉ các phần mở rộng tệp "linh hoạt", tôi nghĩ rằng chúng hầu như bị bỏ qua, phải không?
lá cờ in
@paulgarrett Nó phụ thuộc rất nhiều vào ứng dụng chính xác, nhưng hầu hết mọi thứ trên hầu hết mọi nền tảng khác ngoài Windows, macOS hoặc Android quan tâm đến loại tệp đều xem nội dung tệp hoặc siêu dữ liệu và chỉ quay lại phần mở rộng tệp nếu chúng không thể mặt khác xác định loại tập tin.
Điểm:5
lá cờ ng

Dòng shebang xác định trình thông dịch, trong trường hợp này /bin/bash. Nếu bạn luôn sử dụng cùng một trình thông dịch cho một tập lệnh, thì đây là nơi bạn xác định tập lệnh đó, giúp bạn không phải xác định tập lệnh đó trong lệnh của mình. Thật vô nghĩa khi sử dụng shebang để xác định trình thông dịch mà bạn không muốn sử dụng cho tập lệnh đó.

Tôi thực sự không hiểu làm thế nào một tiện ích mở rộng nguy hiểm hơn tiện ích mở rộng khác hoặc làm thế nào bạn có thể vô tình nhập tất cả những thứ đó. Nếu bạn đang sử dụng tính năng hoàn thành tab, thì một trong hai tiện ích mở rộng sẽ tự động hoàn tất, do đó, tiện ích này không bảo vệ bạn khỏi sự vụng về. Tiện ích mở rộng rất hữu ích để bạn có thể xác định/nhớ loại tệp đó là gì.

Trong mọi trường hợp, việc bạn đặt tên cho tập lệnh là gì không quan trọng. Nó thậm chí không cần một phần mở rộng.

Có một câu hỏi hay về Unix&Linux có thêm thông tin về điều này.

Điểm:1
lá cờ cn

Nếu tên của tệp có bộ bit cho phép thực thi được nhập trên dòng lệnh hoặc nếu tên của tệp đó được chuyển đến một trong các lệnh gọi biến thể exec*() của thư viện thời gian chạy C, thì nhân Linux sẽ cố gắng tải và thực hiện nó.

Điều đầu tiên mà nhân Linux thực hiện là đọc một vài byte đầu tiên của tệp, tìm kiếm các chuỗi "ma thuật" đã biết. Một trong những chuỗi ma thuật đó cũng có thể được hiểu là chuỗi ASCII "#!" còn được gọi là "hash bang" và được rút ngắn thành "shebang". Khi trình tải nhìn thấy điều đó, nó sẽ hiểu phần còn lại của dòng là tên của một tệp khác thành exec, chuyển tệp đầu tiên làm đối số. Một giá trị kỳ diệu khác là "\x7fELF" là một tệp thực thi nhị phân cổ điển, chẳng hạn như chính /bin/sh. Lưu ý rằng mặc định cho bộ nạp hạt nhân, nếu tệp không có phép thuật có thể nhận dạng được, là thực thi /bin/sh và chuyển nó tên của tệp làm đối số đầu tiên -- tương đương với việc có một shebang "#!/bin /sh".

Trên thực tế, việc đánh dấu tập lệnh là có thể thực thi được bằng cách sử dụng chmod +x ./do_one_thing.sh cùng với một Shebang "#!/bin/sh" tương đương với sh ./do_one_thing.sh. "Phần mở rộng tệp" hoặc các khái niệm DOS khác thực sự không liên quan bên ngoài DOS, các hệ điều hành tổ tiên của nó như CP/M và các hệ điều hành con cháu của nó như Microsoft Windows.

Nếu bạn muốn mức độ hoàn hảo nhất, hãy đánh dấu các tệp là có thể thực thi được và sử dụng shebang thích hợp. Đừng dựa vào con người để làm điều đúng đắn.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.