Các tập lệnh trong /etc/profile.d làm gì?


85

Tôi đang đọc về kịch bản shell cơ bản từ Linux Command Line và Shell Scripting Kinh thánh .

Nó nói rằng /etc/profiletệp đặt các biến môi trường khi khởi động shell Bash. Thư mục /etc/profile.dchứa các tập lệnh khác chứa các tệp khởi động dành riêng cho ứng dụng, cũng được thực thi tại thời điểm khởi động bởi trình bao.

  • Tại sao các tệp này không phải là một phần /etc/profilenếu chúng cũng quan trọng đối với khởi động Bash?

  • Nếu các tệp này là các tệp khởi động dành riêng cho ứng dụng không quan trọng đối với khởi động Bash, thì tại sao chúng là một phần của quá trình khởi động? Tại sao chúng không chỉ chạy khi các ứng dụng cụ thể chứa các cài đặt được thực thi?

Câu trả lời:


71

Tại sao các tệp này không phải là một phần của / etc / profile nếu chúng cũng quan trọng đối với khởi động Bash?

Nếu bạn muốn nói, "Tại sao chúng không chỉ được kết hợp thành một tập lệnh khổng lồ?", Câu trả lời là:

  1. Bởi vì đó sẽ là cơn ác mộng bảo trì cho những người chịu trách nhiệm về kịch bản.
  2. Bởi vì có các tập lệnh được tải dưới dạng các mô-đun độc lập làm cho toàn bộ hệ thống có thể điều chỉnh linh hoạt hơn - các tập lệnh riêng lẻ có thể được thêm và xóa mà không ảnh hưởng đến các tập lệnh khác. Vân vân.
  3. Bởi vì chúng được tải thông qua / etc / profile khiến chúng trở thành một phần của "hồ sơ" bash theo cách tương tự.

Nếu các tệp này là các tệp khởi động dành riêng cho ứng dụng không quan trọng đối với khởi động Bash, thì tại sao chúng là một phần của quá trình khởi động? Tại sao chúng không chỉ chạy khi các ứng dụng cụ thể chứa các cài đặt được thực thi?

Điều đó đối với tôi giống như một câu hỏi triết lý thiết kế rộng hơn mà tôi sẽ chia thành hai. Câu hỏi đầu tiên là về giá trị và sự phù hợp của việc sử dụng môi trường shell. Liệu nó có giá trị tích cực? Vâng, nó rất hữu ích. Nó có phải là giải pháp tốt nhất cho tất cả các vấn đề cấu hình? Không, nhưng nó rất hiệu quả để quản lý các tham số đơn giản, và cũng được công nhận và hiểu rộng rãi. Trái ngược với điều đó, quyết định cấu hình những thứ đó không đồng nhất, có lẽ $ PATH có thể được quản lý bởi một công cụ độc lập riêng biệt, các công cụ ưa thích như $ EDITOR có thể nằm trong tệp sqlite ở đâu đó, $ lang lang có thể nằm trong tệp văn bản với định dạng tùy chỉnh ở một nơi khác, v.v. - không chỉ sử dụng biến env và/etc/profile.dĐột nhiên có vẻ đơn giản hơn? Có lẽ bạn đã biết biến env là gì, cách chúng hoạt động và cách sử dụng chúng, so với việc học 5 cơ chế hoàn toàn khác nhau cho 5 khía cạnh phổ biến khác nhau của cái được gọi là "môi trường" một cách thích hợp .

Câu hỏi thứ hai là, "Khởi động có phải là thời điểm thích hợp cho việc này không?", Điều này phản đối rằng nó không hiệu quả lắm (tất cả dữ liệu đó có thể hoặc không được sử dụng, v.v.). Nhưng:

  • Trên thực tế, đó không phải là tất cả dữ liệu, một phần vì không ai có thể sử dụng nó cho nhiều hơn một vài tham số đơn giản (vì có các phương tiện khác để định cấu hình một ứng dụng).
  • Nếu nó được sử dụng một cách khôn ngoan, liên quan đến những thứ thường được gọi, thì cài đặt, ví dụ: $ CFLAGS mặc định từ một tệp ở đâu đó mỗi khi bạn gọi gccsẽ kém hiệu quả hơn. Hãy nhớ rằng số lượng bộ nhớ liên quan là, một lần nữa, vô hạn.
  • Nó có thể liên quan đến những thứ mang tính hệ thống mà nhiều hơn một ứng dụng có thể liên quan và vỏ là một điểm chung .

Có thể thêm nhiều hơn vào danh sách đó, nhưng hy vọng điều này cung cấp cho bạn một số ý tưởng về những ưu và nhược điểm của vấn đề - 'chính' và 'chính' đó là một không gian tên toàn cầu.


Does it have positive ... and understood.Bạn đang cố gắng nói điều gì ? Tôi hiểu mọi thứ khác ngoài đoạn đó.
asheeshr

3
Môi trường shell thường được sử dụng để cấu hình chính shell và các công cụ phổ biến khác. Đây không phải là cách duy nhất mà cấu hình có thể được thực hiện, do đó, đáng để xem xét liệu môi trường tốt hơn hay xấu hơn các tùy chọn khác. Bằng cách có "giá trị dương", tôi có nghĩa là sử dụng môi trường dường như có một số lợi thế so với các tùy chọn khác ít nhất là "quản lý các tham số đơn giản" của WRT - cụ thể là nó rất hiệu quả và "được công nhận và hiểu biết rộng rãi" ... và tôi Sẽ thêm một chút để giải thích thêm cụm từ đó.
goldilocks

Điều gì về việc nối các dòng vào profile.local? Điều này có được chấp nhận so với việc tạo tập lệnh trong thư mục profile.d không?
Avindra Goolcharan

@AvindraGoolcharan Các bản phân phối khác nhau có thể sử dụng các sơ đồ khác nhau cho loại điều này. Thư mục profile.dchỉ hoạt động vì nội dung của nó có nguồn gốc /etc/profile, được chỉ định bởi các shell như bash dưới dạng tệp khởi động (xem HÓA ĐƠN trong man bash); nếu bạn chỉnh sửa /etc/profile, bạn có thể vô hiệu hóa /etc/profile.d. /etc/profile.localdường như là một phát minh của SUSE, có lẽ có nguồn gốc từ một nơi nào đó /etc/profileđể bạn có thể đặt công cụ của mình ở đó. Tuy nhiên, nếu bạn di chuyển nó sang một hệ thống không SUSE và không thực hiện bất kỳ điều chỉnh nào khác, nó sẽ không được sử dụng bởi bất cứ điều gì.
goldilocks

Gotcha, điều đó thật rõ ràng. Vâng, chúng tôi sử dụng SUSE trong công việc của tôi. / etc / hồ sơ. Có vẻ như một đặt cược tốt hơn nhiều.
Avindra Goolcharan

13

Các tệp này dành riêng cho một ứng dụng, nhưng có nguồn gốc khi khởi động shell, không phải khi ứng dụng khởi động. Một thư mục cấu hình được sử dụng ở đây vì lý do tương tự mà nó được tìm thấy ở nhiều nơi khác. Điều này cho phép một ứng dụng hoặc gói phần mềm sửa đổi cấu hình. Điều này sẽ không thể thực hiện được nếu không có cấu hình phân tách, vì nhiều gói cố gắng quản lý / cập nhật một tệp cấu hình duy nhất mà người dùng cũng có thể sửa đổi sẽ bị lỗi và lộn xộn.

Cũng là một lưu ý phụ, /etc/profilecó nguồn gốc từ tất cả các vỏ, không chỉ bash. Tệp cấu hình cụ thể của bash là bashrc và chỉ có nguồn gốc cho các vỏ tương tác.


3
Đoạn thứ hai thật thú vị. Vì các shell khác nhau hỗ trợ cú pháp khác nhau, điều này sẽ yêu cầu phải có một cú pháp chung đáng kể. Đúng cho bash và sh, nhưng tôi không nghĩ vậy đối với những người khác như csh hoặc tcsh, những người có tập lệnh khởi động đăng nhập toàn cầu của riêng họ. Trên nhiều hệ thống, / bin / sh chỉ là một liên kết đến / bin / bash. Nhưng bash sửa đổi hành vi của nó thành tuân thủ theo kiểu posix khi được gọi là sh. Vì vậy, người ta sẽ nghĩ rằng các tác giả của các tập lệnh trong /etc/profile.d sẽ cần phải cẩn thận để tránh sử dụng các phần mở rộng bash bên ngoài tập con posix.
sootsnoot

Trong linux có các tệp .csh và .sh riêng cho hai loại shell chính.
stark

0

Câu trả lời của jordanm là không chính xác. /etc/profilekhông có nguồn gốc bởi tất cả các vỏ. Như bạn chỉ ra, nó không có nguồn gốc bởi csh, tcsh- tôi không chắc chắn về điều đó zsh. Nó có nguồn gốc shtừ các dẫn xuất vỏ Bourne ( ), như Korn Shell ( ksh) và BASH ( bash). cshsử dụng /etc/login. Những người có xu hướng độc quyền sử dụng các dẫn xuất Borne Shell có xu hướng quên các vỏ khác tồn tại. Họ thêm một cái gì đó để /etc/profilemong đợi nó sẽ áp dụng cho "tất cả người dùng" và sau đó rất ngạc nhiên khi người dùng C Shell kỳ lạ (và chúng tôi là một số lẻ) không có nội dung họ định cấu hình /etc/profile.

Mặc dù vậy, mọi người có xu hướng quên đi các vỏ phái sinh Borne Shell khác tồn tại. Nếu họ sử dụng bashhoặc ksh, họ cảm thấy thoải mái khi thêm cú pháp vào /etc/profileđó không hợp lệ trong Bourne Shell, như nói việc xác định một biến và xuất nó trên cùng một dòng. Sau đó, bạn nhận được một số kịch bản đó #!/bin/shvà nó bóp nghẹt cú pháp. /etc/profilenên bám theo cú pháp tương thích của Bourne Shell.

Tương tự như vậy, bạn nên tự mình .profilesử dụng nó (sử dụng .bash_profilenếu bạn muốn một số cú pháp bash) - nó có thể là thêm một chút gõ, nhưng nó là gõ thêm bạn làm tất cả một lần. Tham khảo ${HOME}và không ~, v.v. Một số hương vị của Unix, cron job chạy theo sh, mỗi dòng của bạn Makefileđược xử lý sh, vì vậy nếu bạn đang làm việc trên nhiều hương vị của UNIX, thì thực sự phải trả tiền để giữ cho .profilevỏ Bourne của bạn tương thích. Là một SysAdmin, tôi không thể nói cho bạn biết tôi đã giúp ai đó bao nhiêu lần bằng cách sửa lỗi của họ .profileđể tương thích với Bourne Shell.

Trên Linux, /bin/shlà một liên kết đến /bin/bashvà khi bạn chạy nó, nó trông giống như một con đường được sử dụng để chạy nó và (về lý thuyết) chỉ giới hạn ở những thứ mà Bourne Shell hỗ trợ. Tương tự như vậy, vitrên Linux thực sự vim, một lần nữa tự giới hạn. Thỉnh thoảng bạn thấy các tính năng "chảy qua". Thỉnh thoảng vimgiả vờ visẽ làm một cái gì đó vimhỗ trợ mà vikhông phải vì các tác giả vimquên vô hiệu hóa điều này trong chế độ "tương thích ngược". Tôi sẽ không ngạc nhiên nếu bashgiả vờ shcó một số tính năng "chảy máu" tương tự. Sẽ không ngạc nhiên nếu một số tính năng "hoạt động trên Borne Shell trên Linux", nhưng không phải trên UNIX dựa trên System V hoặc BSD (AIX, OpenBSD, v.v.).


Bạn có chắc chắn "trên Linux /bin/shlà một liên kết đến /bin/bash"? Đó là một tuyên bố âm thanh.
41754
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.