Là biến môi trường $ SHELL chỉ dành cho hệ vỏ tương tác?


7

Tôi thấy hai cách sử dụng cho SHELLbiến môi trường:

  • Nó có thể được sử dụng để chỉ định shell tương tác mà người dùng muốn sử dụng và / hoặc
  • nó có thể được sử dụng bởi các tiến trình để thực thi các lệnh khác, thay thế lệnh trong /bin/sh -c "..."thành ngữ thông thường .

Nếu nó chỉ được sử dụng cho cái trước, nó có thể là một thứ gì đó rất kỳ lạ (ví dụ ipython), nếu nó cũng được sử dụng cho cái sau, nó cần cung cấp một dạng tương thích POSIX cơ bản, ví dụ như hiểu -cthông số và giữ nguyên môi trường ( đó là khó khăn đáng ngạc nhiên ).

Các tiêu chuẩn POSIX không phải là rất rõ ràng ở đây, nó chỉ viết.

Biến này sẽ đại diện cho một tên đường dẫn của trình thông dịch ngôn ngữ lệnh ưa thích của người dùng. Nếu trình thông dịch này không phù hợp với Ngôn ngữ lệnh Shell trong khối lượng Shell và Tiện ích của IEEE Std 1003.1-2001, Chương 2, Ngôn ngữ lệnh Shell, các tiện ích có thể hoạt động khác với các ngôn ngữ được mô tả trong IEEE Std 1003.1-2001.

Việc sử dụng thứ hai có thực sự phổ biến và / hoặc hợp lệ không, và do đó có gì phải lo lắng nếu tôi đặt SHELLthành thứ gì đó lạ không?


2
Câu hỏi dường như cho rằng cài đặt SHELLlà bắt buộc: không phải vậy. POSIX chỉ nêu cách biến được diễn giải khi được đặt. Đối với "chính xác", khía cạnh đó làm cho câu hỏi dựa trên ý kiến ​​(nó sẽ chỉ thu hút ý kiến).
Thomas Dickey

1
Nửa đầu của câu hỏi là vấn đề. Nếu nó chỉ làm rõ lý do tại sao makecó thể sử dụng SHELL, đó là đơn giản. Nhưng đoạn bắt đầu "Nếu nó chỉ được sử dụng", vv, làm suy yếu câu hỏi.
Thomas Dickey

2
@JoachimBreitner, lưu ý rằng thường làm cho các biến được khởi tạo từ các biến môi trường (xem tham chiếu để biết chi tiết), nhưng SHELLđặc biệt ở khía cạnh đó (ít nhất là đối với gnu make), nó không được khởi tạo theo cách đó.
AProgrammer 17/2/2016

1
$SHELLlà biến môi trường duy nhất makekhông được phép nhập. Điều này là do người dùng có thể có một vỏ như thế cshkhông tương thích.
schily

1
BTW, lý do systemchứa "Một người đánh giá đề xuất rằng việc triển khai hệ thống () có thể muốn sử dụng biến môi trường như SHELL để xác định trình thông dịch lệnh nào sẽ sử dụng. Việc triển khai được cho là sẽ sử dụng trình thông dịch lệnh mặc định nếu môi trường được chỉ định bởi môi trường biến không có sẵn. Điều này sẽ cho phép người dùng, khi sử dụng một ứng dụng nhắc các dòng lệnh được xử lý bằng system (), để chỉ định một trình thông dịch lệnh khác. Việc triển khai như vậy không được khuyến khích. "
AProgrammer 17/2/2016

Câu trả lời:


6

Không có API POSIX C nào sử dụng SHELLbiến môi trường một cách rõ ràng. Hàm systempopenphải gọi một chương trình được gọi sh. Một vài tiện ích (ví dụ ex, trên mạng mailx) phải sử dụng $SHELL, nhưng luôn luôn để thực thi mã do người dùng cung cấp; makebỏ qua một cách rõ ràng $SHELL.

Phần về các biến môi trường cho phép các tiện ích , nhưng không phải API C (giao diện hệ thống trên mạng) có hành vi khác nếu $SHELLkhông tuân thủ POSIX sh.

Trong thực tế, SHELLđược đặt thành vỏ đăng nhập của người dùng, có thể tương thích với POSIX. Zsh là những lựa chọn thay thế phổ biến. Tôi đã sử dụng zsh trong một thập kỷ trên các biến thể Unix khác nhau và tôi không nhớ bất kỳ tiện ích hệ thống nào bị lỗi. Tôi đã thấy các cuộc gọi mã bằng văn bản thỉnh thoảng $SHELLthay vì shthực thi các tập lệnh sh. Điều này là khá hiếm và không cần phải ngăn cản bạn thiết lập SHELLbất cứ điều gì bạn thích.

Nói tóm lại, vâng, SHELLlà vỏ tương tác yêu thích của bạn và các ứng dụng không nhận được đảm bảo về cú pháp nào nó chấp nhận hoặc thậm chí liệu nó có chấp nhận -ctùy chọn hay không.

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.