Mengapa / etc / profile tidak dipanggil untuk shell non-login?


51

Login dan shell non-login didefinisikan sebagai:

su - $USER # will give you a login shell
bash # will give you a non-login shell

/ etc / profile tidak dipanggil untuk shell non-login, seperti ketika Anda memulai konsole (kde). / etc / profile hanya dipanggil untuk shell login.

Mengapa demikian? Tolong jelaskan, karena saya suka memahami alasan ini.

Jawaban:


100

/etc/profile dipanggil hanya untuk shell login karena itulah tujuan spesifiknya.

Jika Anda ingin menjalankan perintah untuk shell interaktif yang bukan shell login, dan Anda menggunakannya bash, masukkan ~/.bashrcatau /etc/bash.bashrc.

Tujuan dari file "profil" adalah berisi perintah yang seharusnya dijalankan hanya untuk shell login. File-file ini adalah:

  • /etc/profile, dijalankan oleh semua shell yang kompatibel dengan Bourne (termasuk bashdan dash) ketika dimulai sebagai shell login.

  • Script dalam /etc/profile.d.

    Ini untuk cangkang Bourne-style, tetapi tidak dikodekan ke dalam cangkang executable itu sendiri. Sebaliknya, perintah dalam /etc/profilepanggilan mereka. Misalnya, pada sistem Ubuntu 12.04 saya, /etc/profilesertakan baris-baris ini:

    if [ -d /etc/profile.d ]; then
      for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
          . $i
        fi
      done
      unset i
    fi
    
  • .profile di direktori home pengguna, dijalankan oleh shell yang kompatibel dengan Bourne ketika dimulai sebagai shell login (kecuali diganti, lihat di bawah).

  • .bash_profileatau .bash_logindi direktori home pengguna. Ini diabaikan oleh kerang selain bash. Tetapi jika .bash_profileada, bashjalankan bukan .profile . Jika .bash_profiletidak ada tetapi .bash_loginada, itu dijalankan alih-alih .profile.

    (Tapi itu umum untuk .bash_profileatau .bash_login, ketika ada, harus ditulis sehingga * secara eksplisit memanggil .profile.)

    Manfaat dari file profil khusus shell adalah mereka dapat berisi perintah atau sintaksis yang hanya valid untuk shell itu. Sebagai contoh, saya dapat menggunakan [[operator evaluasi di .bash_profile/ .bash_logintetapi jika saya menggunakannya di .profiledan kemudian masuk dengan dashsebagai shell saya, itu akan gagal.

Apa Yang Harus Masuk Dalam File "profil"

File "profil" harus berisi perintah yang seharusnya hanya dijalankan sekali, pada awal login. (Ini termasuk login grafis, karena mereka mulai dengan shell login juga.) Jika shell interaktif, pengguna yang menjalankannya mungkin logon, dan mungkin memiliki leluhur (yang memulai, atau memulai apa yang memulai, atau memulai itu, dll.) itu adalah shell login.

Anda mungkin ingin menjalankan perintah hanya sekali karena:

  1. tidak ada alasan untuk menjalankannya lebih dari satu kali per login, itu tidak efisien, atau
  2. itu akan menghasilkan hasil yang tidak diinginkan, untuk menjalankannya lebih dari sekali per login.

Sebagai contoh situasi kedua, di mana hasil yang tidak diinginkan akan muncul, pertimbangkan baris-baris ini, yang muncul secara default di setiap pengguna ~/.profile:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Misalkan Anda SSH masuk, jalankan shell lain (katakanlah, zsh), pada titik tertentu ditemukan Anda ingin kembali sementara bashtetapi tetap menggunakan lingkungan Anda (jadi larilah bashlagi ketika masuk zsh), lalu jalankan program seperti mcmenjalankan shell sebagai bagian antarmuka-nya. Jika binada di folder rumah Anda dan nama pengguna Anda adalah james, Anda PATHdi shell paling dalam adalah sesuatu seperti:

/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Itu tidak efisien dan (jauh lebih penting) membuatnya sulit untuk memahami isinya PATH.

Ini sama sekali bukan bencana. Sejauh yang saya tahu, jika setiap shell interaktif bersumber file "profil", tidak ada hal buruk yang akan terjadi, dalam konfigurasi default . Namun, karena tujuan dari file "profil" adalah berisi perintah untuk hanya menjalankan sekali per login , pengguna atau administrator dapat menambahkan perintah ke profil yang hanya harus dijalankan ketika memulai shell login.

Tempat Menempatkan Perintah untuk Setiap Shell Interaktif untuk Dijalankan

Jika Anda menggunakan bash, ada file untuk perintah yang harus dijalankan di setiap shell interaktif:

  • /etc/bash.bashrc
  • .bashrc di direktori home pengguna.

Ini paling umum digunakan untuk perintah itu

  1. hanya mempengaruhi lingkungan shell di mana mereka menjalankan - bahkan kulit anak, atau
  2. harus dijalankan walaupun ini bukan shell login.

Sebagai contoh, penyelesaian-tab-baris perintah umumnya harus diaktifkan apakah bashshell login atau tidak . Jadi ini muncul di ~/.bashrc:

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

Di sana, 1 dan 2 keduanya berlaku: ini tidak terbawa ke shell lain yang dijalankan di dalam yang ini, dan penyelesaian tab harus bekerja bashbahkan jika saya masuk dengan shell yang berbeda.

Tempat Menempatkan Perintah untuk Shells Login dan Shells non-Login Interaktif

Jika Anda menggunakan bashdan ingin menjalankan perintah di shell login dan shell interaktif dan yang bukan shell login, biasanya cukup untuk memasukkannya ke dalam /etc/bash.bashrcatau~/.bashrc . Ini karena, secara default, /etc/profiledan ~/.profilemenjalankannya secara eksplisit. Misalnya, ~/.profilememiliki:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

(Demikian pula, /etc/profilesumber /etc/bash.bashrcuntuk bash.)

Dengan demikian, kedua file "profil" dan "rc" berjalan ketika Anda memulai bashshell interaktif (apakah itu shell login atau tidak).

Tempat Menempatkan Perintah untuk Menjalankan di Kerang non-Interaktif

Anda mungkin tidak ingin menentukan perintah apa pun untuk menjalankan semua shell non-interaktif; mereka akan berjalan setiap kali skrip dijalankan (asalkan skrip dijalankan oleh shell yang Anda konfigurasikan untuk menjalankannya).

Ini dapat menyebabkan kerusakan substansial. Jika Anda akan melakukan ini, dan tidak ada akun administrator di sistem selain yang Anda gunakan, Anda mungkin ingin membuatnya; yang dapat membuatnya lebih mudah untuk memperbaiki kesalahan.

Dalam bash, file "rc" sebenarnya dijalankan apakah shell itu interaktif atau tidak . Namun, di bagian atas mereka mengatakan:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Jadi, jika Anda memerlukan perintah untuk menjalankan secara otomatis bahkan dalam shell non-interaktif seperti yang dijalankan untuk menjalankan skrip, Anda dapat menambahkan perintah Anda sebelum baris tersebut.

Memulai Shell Login

Masuk log memulai shell login. Jika Anda ingin shell dimulai setelah itu berperilaku sebagai shell login, mulailah dengan -lflag (singkatan dari l ogin ). Sebagai contoh:

Itulah cara terbaik untuk memulai shell login (tanpa masuk) kecuali jika Anda ingin memulai sebagai pengguna lain . Kemudian, gunakan:

  • sudo -iuntuk root(digunakan sudo -suntuk shell root interaktif, non-login)
  • sudo -u username -i untuk setiap pengguna
  • su - usernameuntuk non- rootpengguna (gunakan untuk shell root interaktif, non-login)su username

Apa itu shell login awal ?

Sebuah shell login awal adalah sama sebagai shell login . Di mana-mana jawaban ini mengatakan "shell login" bisa juga mengatakan "shell login inital" (kecuali di bagian ini, yang sudah berhenti masuk akal).

Salah satu alasan untuk istilah shell login inital adalah bahwa shell login juga digunakan dalam arti yang berbeda - untuk mengidentifikasi program mana yang digunakan sebagai shell yang dijalankan dengan masuk. Ini adalah arti dari shell login yang digunakan untuk mengatakan:

Bacaan lebih lanjut


4
Salah satu jawaban terbaik untuk setiap pertanyaan di situs Stack Exchange apa pun.
Mark E. Haase

1
> "profil" file harus berisi perintah yang seharusnya hanya dijalankan sekali, pada awal login. (Ini termasuk login grafis, karena mereka mulai dengan shell login juga.) Tidak, tidak, tidak, tidak, tidak! Sama sekali tidak! Semua shell seperti bourne hanya membaca. Profil pada sesi shell login interaktif , yaitu yang dimulai dengan opsi -i, atau yang terhubung ke terminal pengendali (tidak ada yang benar jika shell dimulai oleh manajer tampilan). Alasan ini benar adalah karena titik file ini adalah mengatur terminal pengguna , bukan hanya lingkungan mereka. Jika manajer tampilan tr

Eliah, saya telah mereproduksi sisa komentar Derek di sini tetapi telah meninggalkan tunggul di atas sehingga dia akan mendapatkan notifikasi balasan Anda, meskipun ia tidak akan dapat menjawabnya karena persyaratan reputasi. Saya sudah memberinya akses tulis ke chatroom di atas.
Seth

1
In bash, the "rc" files are actually run whether the shell is interactive or not. salah. /etc/bash.bashrc dipicu oleh /etc/bash.profile.
okwap

okwap benar, file rc tidak dipanggil dalam shell non-interaktif, ini lebih ringkas dan akurat.
Nick Allen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.