Định cấu hình gnome-terminal để bắt đầu bash làm vỏ đăng nhập, không đọc .bashrc


24

Tôi đang cố gắng tích hợp RVM với thiết bị đầu cuối gnome .

Theo mặc định, gnome-terminal không bắt đầu bash như một vỏ đăng nhập. Tôi đã kích hoạt run command as a login shellnhư được đề xuất trong câu trả lời này về cùng một chủ đề thiết lập RVM, nhưng khi tôi làm điều này thì .bashrctệp không được đọc.

Ví dụ, tôi tạo một biến môi trường .bashrcvà sau đó khi tôi bắt đầu một thiết bị đầu cuối gnome mới, tôi không thể đọc nó. Tôi cần phải chạy rõ ràng source .bashrcđể đọc các tập tin.

Đây có phải là hành vi dự kiến?

Câu trả lời:


38

Vâng, đó là hành vi dự kiến.

Tóm lại, hành vi như sau:

  • bash bắt đầu như một vỏ đăng nhập tương tác: đọc ~/.profile
  • bash bắt đầu như một vỏ không đăng nhập tương tác: đọc ~/.bashrc

Đọc hướng dẫn bash về các tập tin khởi động để biết thêm chi tiết.

Cá nhân, tôi nghĩ rằng hành vi này là lạ và tôi chưa tìm thấy sự hợp lý hóa cho quyết định thiết kế này.


Một số giải thích về thuật ngữ:

  • Một shell tương tác là một shell mà bạn có thể tương tác, có nghĩa là bạn có thể gõ các lệnh trong đó. Hầu hết các shell bạn sẽ sử dụng là shell tương tác.
  • Một vỏ không tương tác là một vỏ mà bạn không thể tương tác. Shell script chạy bên trong shell không tương tác.
  • Một vỏ đăng nhập là vỏ được bắt đầu khi bạn đăng nhập vào hệ thống của bạn.
  • Một không đăng nhập vỏ là một cái vỏ mà được bắt đầu sau khi quá trình đăng nhập.

Hầu hết các shell bạn thấy là các shell không đăng nhập tương tác . Điều này đặc biệt đúng nếu bạn đang chạy một môi trường đồ họa như gnome, bởi vì sau đó gnome là "vỏ đăng nhập". Bất kỳ phiên bash nào bắt đầu bên trong gnome đều là shell không đăng nhập. Nếu bạn muốn thấy một vỏ đăng nhập tương tác thực sự, hãy vào một bảng điều khiển ảo (sử dụng Ctrl+Alt+F1) và sau đó đăng nhập bằng tên người dùng và mật khẩu của bạn. Đó là một vỏ bash đăng nhập tương tác thực sự. Bạn có thể quay lại vỏ đồ họa bằng cách sử dụng Ctrl+Alt+F7.

Có một tùy chọn --loginsẽ làm cho bash hoạt động như thể nó là một vỏ đăng nhập ngay cả khi đã bắt đầu sau khi bạn đã đăng nhập. Định cấu hình gnome-terminal để bắt đầu bash như một vỏ đăng nhập có nghĩa là nó sẽ bắt đầu bash bằng --logintùy chọn.


Thông thường bạn muốn bash luôn đọc ~/.bashrctrong một vỏ tương tác. Đây là cách tôi khuyên bạn nên làm điều đó:

Tạo một ~/.bash_profiletập tin. Nếu bash được bắt đầu như một vỏ đăng nhập, trước tiên nó sẽ tìm kiếm ~/.bash_profiletrước khi tìm kiếm ~/.profile. Nếu bash tìm thấy ~/.bash_profilethì nó sẽ không đọc ~/.profile.

Đặt các dòng sau vào ~/.bash_profile:

[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"

Bây giờ nếu bash được bắt đầu như một vỏ đăng nhập tương tác, nó sẽ đọc các tệp sau:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

và nếu bash được bắt đầu như một vỏ không đăng nhập tương tác:

  1. ~/.bashrc

Bạn nên đặt những thứ cụ thể là bash ~/.bashrcvà những thứ không phải là bash cụ thể ~/.profile. Ví dụ PATHđi vào ~/.profileHISTCONTROLđi vào ~/.bashrc.

Lưu ý rằng ~/.profilekhông phải là bash cụ thể. Các shell dựa trên văn bản khác (ví dụ sh hoặc ksh) và shell đồ họa (gnome) cũng đọc ~/.profile. Đó là lý do tại sao bạn không nên đặt bash cụ thể vào ~/.profile.


1
+1. Cảm ơn, điều này đã đẩy tôi lên tường ... :-)
richsage

1
mywiki.wooledge.org/DotFiles giải thích một số lịch sử về lý do tại sao nó giống như vậy. Lý do chính cho vấn đề này với rvm mặc dù là rvm đặt mã, có nghĩa là ở ~/.bashrcvị trí đầu tiên, trong hồ sơ thay thế. Lỗi là trên rvm.
geirha

Theo @geirha, họ nên sử dụng~/.profile
sanmai

Lý do là kịch bản hồ sơ có thể kiểm soát việc đánh giá .bashrctương đối với những gì nó cần làm. Nếu vỏ tương tác luôn luôn đọc .bashrcthì nên trước hay sau .profile? Điều gì sẽ xảy ra nếu bạn muốn thiết lập một số thứ trong .bashrcđó là điều .profilehiển nhiên? đồng thời bạn muốn một số thứ .bashrcđể dựa vào một cái gì đó được thiết lập bởi .profile? Không tải thứ tự sẽ đáp ứng cả hai kịch bản.
Kaz

11

Đây không phải là một quyết định thiết kế tồi, cũng không phải là lỗi, cũng không phải là hành vi dự kiến ​​của đạn pháo và thiết bị đầu cuối

Nó chỉ đơn thuần là một giá trị mặc định đáng tiếc của tùy chọn cấu hình trên mỗi cấu hình trong Gnome Terminal, mà bạn có thể dễ dàng sửa chữa.

  1. Chuyển đến Chỉnh sửa -> Tùy chọn hồ sơ .

  2. Chọn tab Tiêu đề và Lệnh .

  3. Lưu ý cách hộp kiểm Run như hộp kiểm đăng nhập được bỏ chọn! Kiểm tra nó.

Đó là nó. Nếu bạn làm điều này với Defaulthồ sơ, hoặc bất kỳ cấu hình nào được cấu hình để sử dụng khi tạo thiết bị đầu cuối mới, bạn sẽ nhận được một vỏ đăng nhập.

Tôi đoán rằng dưới mui xe, tùy chọn này có thể khiến nó chuyển -ltùy chọn sang shell.


0

Tôi đã có cùng một câu hỏi và tìm thấy một giải pháp: Đơn giản chỉ cần sử dụng SSH cho vỏ đăng nhập thực sự!

1. Là siêu người dùng, hãy tạo một người dùng hệ thống rvm chuyên dụng để cách ly hoàn toàn và gán mật khẩu:

sudo su

useradd -m rvmuser

passwd rvmuser

2. Cài đặt các phụ thuộc để rvm có thể xây dựng hồng ngọc mà không yêu cầu mật khẩu siêu người dùng:

apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev

3. SSH vào localhost để có vỏ đăng nhập thực sự (bạn có thể phải apt-get install ssh)

ssh rvmuser@localhost

4. Cài đặt rvm

\curl -sSL https://get.rvm.io | bash -s stable

5. Đăng xuất và đăng nhập lại để tất cả các chức năng rvm được tải

exit

ssh rvmuser@localhost

6. Sử dụng rvm :)


0

Thông thường khi sử dụng bash để đặt khởi tạo hồ sơ .bash_profile, chỉ được đọc bằng bash khi đăng nhập, trong khi các shell khác đã được chia sẻ trong lịch sử .profile. Điều này cho phép bạn đặt các lệnh cụ thể bash vào .bash_profile.

Việc sử dụng sau đây thường được thực hiện để lấy các bí danh được xác định trong .bashrc:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
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.