Mengapa saya perlu menjalankan "/ bin / bash --login"

11

Saya baru saja menyiapkan server Ubuntu 13.10 baru dengan ruby ​​2.1.1 diinstal melalui rvm.

Masalahnya adalah bahwa setiap kali saya beralih ke "rails" pengguna (pengguna saya menginstal ruby ​​dan rails dengan) saya harus menjalankan /bin/bash --loginsebelum Ubuntu mengakui bahwa ruby, rails atau rvmdiinstal.

Semoga ada yang tahu:

  1. Apa yang dilakukan perintah di atas?
  2. mengapa saya harus menjalankannya?
  3. dan apa yang bisa saya lakukan untuk menyelesaikannya sekali dan untuk semua? :)

Bantuan apa pun dihargai!

Ole Henrik Skogstrøm
sumber
2
Bagaimana Anda beralih ke "rel" pengguna (biasa su? Atau sesuatu seperti su -latau su --?). Apa shell login untuk "rails" pengguna? Apakah Anda memodifikasi variabel PATH pengguna dan jika demikian dalam file mana ( ~/.profileatau ~/.bashrcatau ~/.bash_profileatau ...?)
steeldriver
Saya melihat sekarang bahwa masalahnya hanya terjadi ketika saya menggunakan perintah su untuk beralih dari root ke pengguna rel. Ketika saya ssh dengan pengguna rel masalah ini tidak terjadi. Namun saya masih ingin tahu apa yang dilakukan / bin / bash --login. :)
Ole Henrik Skogstrøm

Jawaban:

11

Kedengarannya seperti lingkungan yang diperlukan sistem untuk menemukan komponen ruby ​​yang diinstal ditentukan dalam file yang hanya bisa dibaca untuk shell login. Halaman manual bash mengatakan ini tentang perbedaan antara shell login dan shell non-login:

INVOCATION
   A  login shell is one whose first character of argument zero is a -, or
   one started with the --login option.

dan

   When bash is invoked as an interactive login shell, or as a non-inter
   active shell with the --login option, it first reads and executes  com
   mands  from  the file /etc/profile, if that file exists. After reading
   that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
   in  that order, and reads and executes commands from the first one that
   exists and is readable.  

sedangkan

   When an interactive shell that is not a login shell  is  started,  bash
   reads  and  executes  commands  from /etc/bash.bashrc and ~/.bashrc, if
   these files exist. 

Karenanya jika variabel lingkungan ruby ​​ada di dalam /home/rails/.profileatau /etc/profilemisalnya, mereka akan ditambahkan ke lingkungan shell

  • dengan secara eksplisit memanggil shell login menggunakan su -l railsatau su --login railsatau stenosu - rails
  • saat pengguna railsmasuk melalui SSH
  • dengan memulai subkulit bash --loginsetelah masuk

Jika Anda ingin lingkungan ruby ​​ditetapkan terlepas dari bagaimana Anda beralih ke pengguna rails, Anda bisa memindahkan definisi variabel yang relevan ke pengguna ~/.bashrc.

Steeldriver
sumber
Hmmm, ok, saya pikir saya perlu contoh dari bagian terakhir. Saya baru mengenal linux dan ubuntu. Apa definisi variabel yang relevan? Dalam file apa mereka ditulis sekarang? Bisakah Anda memberi saya contoh? Ini agak teoretis.
Ole Henrik Skogstrøm
4

Saya tahu bahwa pertanyaan ini ditanyakan 2 tahun lalu, tetapi jika seseorang (seperti saya) masih menghadapinya: @steeldriver benar - Anda kehilangan sesuatu bashrcyang Anda miliki di salah satu dari 3 file tersebut. Dalam kasus saya, saya hanya perlu menambahkan baris ini ke baris saya ~/.bashrc:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
PepeHands
sumber