/ etc / hồ sơ không được cung cấp


45

Cho ngày 11.04, tôi đã cài đặt hệ thống mới. Một phần của cài đặt đó là để cài đặt rvm , trong đó dính rvm.shvào /etc/profile.d/. Điều này không hoạt động vì /etc/profile(tải mỗi + r in /etc/profile.d/*.sh) không được tải. Theo tài liệu, hồ sơ chỉ có nguồn gốc nếu bash được chạy trong đăng nhập. Để xác minh điều này, tôi đã gọi bash --login, sau đó rvmđã có sẵn.

Điều này đã làm việc cho tôi trong các phiên bản trước của Ubuntu mà không cần cấu hình. Nghĩa là, bản cài đặt mới 10.10 sẽ chính xác nguồn hồ sơ / .d.

Câu hỏi của tôi là: có bất cứ điều gì tôi đang làm sai, hoặc có một số giả định mới được đưa ra trong Natty đã phá vỡ điều này? Cách giải quyết hiện tại của tôi là source /etc/profilevào ~/.bashrc(điều này thật tệ vì hồ sơ có nghĩa là tải trước bashrc, nhưng thực hiện thủ thuật).

Câu trả lời:


52

Theo mặc định, gnome-terminal không bắt đầu bash như một vỏ đăng nhập (tôi giả sử bạn có nghĩa là bash bắt đầu bên trong một gnome-terminal). Điều đó có nghĩa là bash sẽ không đọc /etc/profilehoặc ~/.profile. Như bạn đã quan sát chính xác, bash sẽ đọc các tệp đó nếu được bắt đầu như một vỏ đăng nhập.

Cách khắc phục nhanh vấn đề của bạn là cấu hình gnome-terminal để bắt đầu bash làm vỏ đăng nhập để nó sẽ đọc /etc/profile. Để làm điều đó, bạn phải kích hoạt "Chạy lệnh dưới dạng vỏ đăng nhập" trong gnome-terminal "Tùy chọn hồ sơ" có thể truy cập từ menu Chỉnh sửa.

Tôi không khuyên bạn nên làm điều này bởi vì nó làm rối tung sự phân biệt giữa ~/.profile~/.bashrc. Tốt nhất ~/.profilenên làm những thứ được yêu cầu chỉ một lần, trong khi đăng nhập, trong khi ~/.bashrcnên làm những thứ được yêu cầu mỗi khi bash được bắt đầu.

Có một câu hỏi và câu trả lời tại superuser nói về sự khác biệt giữa bashrc và hồ sơ . Đọc ở đó để biết thêm thông tin.

Từ mô tả vấn đề của bạn, có vẻ như tập lệnh rvm chỉ cần được tải một lần, trong khi đăng nhập. Theo tôi biết Ubuntu đã cấu hình đăng nhập đồ họa để đọc /etc/profile/~/.profile. Điều đó có nghĩa là, sau khi đăng xuất và đăng nhập một lần, tập lệnh rvm sẽ được kích hoạt. Nếu nó vẫn không hoạt động, thì có lẽ tập lệnh rvm cần được tải cho mỗi phiên bash. Nếu đó là trường hợp thì đó bashrclà nơi thích hợp hơn cho kịch bản.


Đặt 'lệnh chạy dưới dạng vỏ đăng nhập' thực sự đã tải /etc/profile(và do đó là .d). Cảm ơn lời giải thích - có vẻ như điều này đòi hỏi phải theo dõi với dân gian rvm.
Marc

7
Ubuntu 11.04 dường như không đọc /etc/profile~/.profiletrong khi đăng nhập. Thật lạ vì nó luôn hoạt động với các phiên bản cũ hơn. Tôi nghĩ rằng đây không phải là một giải pháp mà là một cách giải quyết.
Luca

2
@lesmana Có cách nào để tôi có thể kích hoạt "Chạy lệnh dưới dạng vỏ đăng nhập" từ CLI thay vì GUI không? Tôi được đưa vào một máy chủ từ xa và không thể chuyển tiếp X cục bộ.
Waseem

5

Tuy nhiên, có một tệp /etc/bash.bashrc được đọc bởi gnome-terminal và là "tệp .bashrc trên toàn hệ thống cho các vỏ bash (1) tương tác."

Cuộc gọi của tôi đến chức năng rvm [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm", đã đến đó và hoạt động tốt cho một vài người dùng trên hệ thống đó.


gnome-terminal không làm gì cả. gnome-terminal chạy bash (hoặc bất cứ thứ gì mà vỏ đăng nhập của bạn được đặt thành trong cơ sở dữ liệu passwd) trong chế độ tương tác và bash bắt đầu đọc tương tác /etc/bash.bashrc. Chà, ít nhất là trên Debian / Ubuntu. Bash thường không đọc bashrc toàn hệ thống; debian đã vá nó để làm như vậy.
geirha

@geirha: dmitri @ Eos: ~ $ uname -a Linux Eos 3.0.0-16-generic # 29-Ubuntu SMP Tue Ngày 14 tháng 2 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux dmitri @ Eos: ~ $ cat / etc / bash.bashrc # Tệp .bashrc trên toàn hệ thống cho các vỏ bash (1) tương tác. # Để kích hoạt cài đặt / lệnh trong tệp này cho shell đăng nhập, # tệp này phải có nguồn gốc trong / etc / profile. # Nếu không chạy tương tác, đừng làm gì cả [-z "$ PS1"] && return .....
Dmitri

2
Vâng, rõ ràng, gnome-terminal gọi bash để đọc tệp đó: nếu shell của bạn là ksh, thì gnome-terminal sẽ không đọc tệp đó, phải không? Tôi có thể đề nghị tra từ "pedant" trong từ điển trước khi bạn tiếp tục sử dụng các cụm từ khiêu khích như "does nothing of the sort".
Dmitri

4

Cài đặt RVM dưới dạng nhiều người dùng yêu cầu người dùng chạy lệnh này:

(vì Ubuntu không có nguồn /etc/profile.d khi đăng nhập)

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function' >> ~/.bashrc

3
Ubuntu có nguồn các tệp trong /etc/profile.d/khi đăng nhập vì các /etc/profilevòng lặp mặc định thông qua và các nguồn, các tệp trong /etc/profile.d/. Tuy nhiên, nếu điều này rvm.shchứa mã cho các vỏ tương tác, chẳng hạn như các hàm hoặc bí danh, thì chúng có nguồn gốc /etc/profilelà vô nghĩa. Thiết lập cho các phiên bash tương tác phải được trong .bashrc.
geirha

0

nếu bạn có ZSH hoặc OH-MY-ZSH, hồ sơ của bạn là / etc / zprofile


0

Tôi thực sự đã tìm thấy cho những người không muốn khởi động lại hoàn toàn các hộp của họ trừ khi hoàn toàn bắt buộc ...

Bạn không cần phải khởi động lại toàn bộ máy để có những thay đổi /etc/profilecó hiệu lực. Tất cả những gì bạn cần là khởi động lại GUI XWindows Desktop để nó đọc lại các cấu hình (như thể nó sẽ được khởi động như một phần của khởi động lại toàn hệ thống).

Đối với tôi, tôi sử dụng xUbfox sử dụng LightDM nhưng bạn có thể đăng ký bất cứ thứ gì có thể thực thi được gọi cho máy tính để bàn hiện tại của bạn.

Trước tiên, bạn không thể sử dụng trình giả lập thiết bị đầu cuối từ bên trong GUI của máy tính để bàn để thực hiện việc này (ít nhất là không với LightDM), bạn cần sử dụng SSH hoặc bàn điều khiển phụ (nếu bạn giữ Ctrl + Alt và nhấn phím F hoặc phím số bạn nên thả từ màn hình đăng nhập hoặc màn hình đồ họa của bạn vào một cửa sổ đầu cuối đơn giản). Tôi cũng khuyên bạn nên đóng mọi thứ trên máy tính để bàn từ xa như VNC nếu bạn đang sử dụng SSH (rõ ràng SSH có thể được kết nối, bạn không muốn cửa sổ VNC mở được hiển thị trong khi nó đang cố khởi động lại vì điều này có thể bị treo khi khởi động lại nó chờ bạn chấm dứt phiên VNC).

Tôi làm điều này mọi lúc với SSH và nó là một cứu cánh lớn đặc biệt là khi bạn không sử dụng máy của mình và không cảm thấy chờ đợi để khởi động lại đầy đủ và kết nối lại :-D

Bây giờ là phần dễ dàng một lần trong thiết bị đầu cuối "phụ" hoặc SSH: (Có, điều này sẽ giết phiên hiện tại của bạn, hãy chắc chắn rằng bạn không phiền, lưu bất kỳ tài liệu mở hoặc công việc nào)

sudo service lightdm restart

Đợi một phút vì nó giết chết máy tính để bàn và sau đó khởi động lại (điều này có thể mất vài giây tốt khi mọi thứ dừng lại và sau đó thực hiện lại khi bắt đầu)

Đó là, bây giờ khi bạn quay trở lại giao diện điều khiển 0 hoặc bạn sử dụng VNC để kết nối lại, bạn sẽ được chào đón bởi dấu nhắc đăng nhập và đăng nhập như bình thường và nếu bạn mở trình giả lập thiết bị đầu cuối và hãy ra lệnh ngay bây giờ không có vấn đề gì vì mọi thứ đều được cung cấp lại giống như khi bạn khởi động lại máy đầy đủ.

Chỉ cần nhớ, nếu bạn phát hành sudo service lightdm restart[hoặc stop, startbất cứ điều gì] từ chính môi trường máy tính để bàn bằng trình giả lập thiết bị đầu cuối, lệnh sẽ chỉ treo ở đó và dường như không có gì xảy ra. Điều này là do bạn hiện đang sử dụng bảng điều khiển đó (còn gọi là màn hình hiển thị) 0 và do đó, nó không thể hoàn toàn tắt và quay lại vì nó đang chờ máy tính để bàn không được sử dụng trước khi chạy lệnh.

Lưu ý cuối cùng: Tôi chưa thử phát hành khởi động lại trên môi trường từ bên trong máy tính để bàn trong trình giả lập thiết bị đầu cuối và sau đó chuyển sang bảng điều khiển khác có thể khởi động lại nó, nhưng nếu bạn đã chuyển đổi giao diện điều khiển thì tại sao không chạy lệnh từ đó có nên được không?


-4

tiếng vang ".profile" >> ~ / .bashrc

Và sau đó mở một cửa sổ khác. Tôi nghĩ rằng đây là cách tiếp cận dễ dàng.


1
Vì các .profilenguồn mặc định .bashrc, điều này sẽ dẫn đến một vòng lặp cho hầu hết người dùng.
muru
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.