Có phải shem shith phải có trong thư mục của Cameron / bin không?


16

Tôi đã đọc rằng các hệ điều hành tuân thủ POSIX (ví dụ: Linux) phải có shvỏ.

Nhưng nó được yêu cầu shphải có trong /binthư mục, hoặc nó có thể nằm trong bất kỳ thư mục nào?


Bạn luôn có thể sử dụng một liên kết tượng trưng /bin/sh, trong hầu hết các trường hợp trên linux, nó đã là một liên kết tượng trưng bash. Chỉ là có rất nhiều tập lệnh sử dụng mã hóa cứng/bin/sh
trụ

5
Bây giờ bạn đã có câu trả lời rằng nó có thể sống ở bất cứ nơi nào nó muốn, bạn có thể tự hỏi: làm thế nào bạn có thể viết một dòng shebang cho sh? Và câu trả lời là: shebang cũng không phải là một phần của POSIX, vì vậy vấn đề thậm chí không xuất hiện.
Jörg W Mittag

1
@ JörgWMittag Vâng, đôi khi thật đáng ngạc nhiên khi có bao nhiêu điều chúng tôi nghĩ là các tính năng Unix "tiêu chuẩn" không thực sự được POSIX yêu cầu.
Barmar

1
Việc bạn có sử dụng shebang hay không độc lập với việc đường dẫn /bin/shcó tồn tại trên hệ thống POSIX hay không.
chepner

Ít nhất là trên các hệ thống có nguồn gốc từ Ubuntu, /bin/shlà một liên kết đến dash. Trên BSD, /bin/shnó không phải là một liên kết mà là một thực thi riêng biệt, và chắc chắn là không bash.
Rhialto hỗ trợ Monica

Câu trả lời:


22

POSIX chỉ có quy định thành /dev/tmpthư mục để tồn tại , và /dev/null, /dev/tty/dev/consoletập tin. Các tiện ích tiêu chuẩn phải tồn tại, nhưng không có vị trí cụ thể được chỉ định. Có thể không có một /binchút nào, và nếu có nó có thể không chứa một sh, và nếu nó có thể không phải là một POSIX sh.

Bạn có thể nhận được một PATHbiến hợp lệ bao gồm các công cụ POSIX, bao gồm sh, với getconflệnh :

$ PATH=$(getconf PATH)
$ sh

Điều này có thể hữu ích, ví dụ như Solaris, trong đó mặc định shkhông tương thích với POSIX , nhưng tuân thủ shđược cung cấp và truy cập theo cách đó (vì Solaris là một Unix được chứng nhận ). getconf PATHsẽ bao gồm /usr/xpg4/binở phía trước, trong đó có POSIX shvà một số công cụ cần thiết khác ( bao gồm cả nhữngcd công cụ vô dụng như ).


Re Solaris: ... trừ khi bạn đang chạy cài đặt "máy chủ nhỏ" của Solaris, mà bỏ qua nhiều công cụ POSIX. Xem unix.stackexchange.com/q/360359/135943
tự đại diện

Những người "vô dụng"? Tôi muốn gọi họ là dư thừa.
Mukesh Sai Kumar

2
vậy làm thế nào để có được getconf?
Joshua

@MukeshSaiKumar một lệnh 'cd' độc lập không bao giờ có thể hoạt động
OrangeDog

Chà, nó sẽ "hoạt động" chỉ với một giá trị làm việc, giả sử, kiểm tra xem bạn có thể thay đổi thành một thư mục hay không, nhưng thực tế không để lại quá trình gọi nó ở đó. Đó là nhiều chức năng hơn không có gì, mặc dù.
Charles Duffy

12

Không, nó không bắt buộc shphải ở trong /bin. Nó rõ ràng đã trích dẫn /bin, /usr/bin/usr/xpg4/binlà địa điểm có thể. Thông số POSIX chỉ yêu cầu shtrong PATH.

Thông số kỹ thuật POSIX nêu rõ:

Các ứng dụng cần lưu ý rằng PATH tiêu chuẩn cho shell không thể được coi là /bin/shhoặc /usr/bin/sh, và nên được xác định bằng cách thẩm vấn PATH được trả về bởi getconf PATH, đảm bảo rằng tên đường dẫn được trả về là tên đường dẫn tuyệt đối chứ không phải là vỏ được tích hợp.

Ví dụ: để xác định vị trí của tiện ích sh tiêu chuẩn:

command -v sh

Trên một số triển khai, điều này có thể trở lại:

/usr/xpg4/bin/sh


2

Như những người khác ở đây đã nói, điều này không bắt buộc phải tuân thủ POSIX.

Nhưng khả năng tương thích với phần mềm hiện có quan trọng hơn nhiều (xét cho cùng, mục đích của POSIX là để một số thứ hoạt động trên tất cả các hệ điều hành phù hợp) và nếu một hệ điều hành không cung cấp sh /bin/sh, điều đó sẽ phá vỡ một số thứ.

Rõ ràng nhất, các kịch bản #!/bin/shdựa trên đường dẫn này được chuẩn hóa. Điều này là không cần thiết để làm việc; POSIX thậm chí không yêu cầu #!các dòng được hỗ trợ, mặc dù nó đề cập rằng chức năng đó là phổ biến :

Một cách khác mà một số triển khai lịch sử xử lý các tập lệnh shell là nhận ra hai byte đầu tiên của tệp là chuỗi ký tự "#!" và sử dụng phần còn lại của dòng đầu tiên của tệp làm tên của trình thông dịch lệnh để thực thi.

Nhưng nếu điều đó không được hỗ trợ, rất nhiều phần mềm hiện có sẽ bị hỏng hoặc yêu cầu thêm công việc để chuyển.

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.