Apakah ada file setara ".bashrc" yang dibaca oleh semua shell?

105

Apakah ~/.bashrc satu-satunya tempat untuk menentukan variabel lingkungan spesifik pengguna, alias, modifikasi ke PATHvariabel, dll?

Aku bertanya karena tampaknya ~/.bashrctampaknya bash-hanya, tapi kerang lain ada juga ...

Stefan
sumber

Jawaban:

94

File $HOME/.profileini digunakan oleh sejumlah shell, termasuk bash, sh, dash, dan mungkin lainnya.

Dari halaman bash man:

Ketika bash dipanggil sebagai shell login interaktif, ... pertama kali membaca dan mengeksekusi perintah dari file / etc / profile, jika file itu ada. Setelah membaca file itu, ia mencari ~ / .bash_profile, ~ / .bash_login, dan ~ / .profile, dalam urutan itu, dan membaca serta mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca.

csh dan tcsh secara eksplisit tidak melihat ~/.profiletetapi cangkang itu agak kuno.

msw
sumber
7
Zsh secara default tidak membaca .profile. Itu sebabnya saya menghapus jawaban saya sebelumnya yang menyatakan ini. Zsh hanya membaca .profile saat dijalankan oleh tautan simbolik bernama sh.
fschmitt
10
tcsh masih populer di beberapa lingkungan.
Maciej Piechotka
1
fschmitt: terima kasih atas koreksi; tetap. Maciej Piechotka: Saya tidak ragu itu benar; namun dimungkinkan juga (walaupun rumit) untuk membuat * skrip rc yang mengimpor skrip rc khusus lainnya berdasarkan shell yang sedang mereka jalankan.
msw
1
Agar cara ini berfungsi, pengguna perlu memastikan bahwa setiap shell adalah shell login. Misalnya, di Terminal Gnome, buka Profil -> Judul dan Perintah, dan aktifkan Run command as a login shell. Anda juga perlu menghapus ~/.bash_profile, atau menjadikannya sumber ~/.profile.
Mikel
@ fschmitt Anda juga dapat sumber $HOME/.profiledari dalam Zsh Anda juga .zshrc. Saya cenderung untuk meletakkan semua hal-hal shell portabel saya .profiledan kemudian saya dapat membagikannya di lingkungan apa pun yang mungkin saya lompati.
Benjamin R
56

~/.profileadalah tempat yang tepat untuk definisi variabel lingkungan dan untuk program non-grafis yang ingin Anda jalankan ketika Anda masuk (misalnya ssh-agent, screen -m). Ini dijalankan oleh shell login Anda jika itu adalah shell bergaya Bourne (sh, ksh, bash). Zsh berjalan ~/.zprofilesebagai gantinya, dan Csh dan tcsh berjalan ~/.login.

Jika Anda masuk di bawah manajer tampilan X (xdm, gdm, kdm, ...), apakah ~/.profiledijalankan tergantung bagaimana manajer tampilan Anda dan mungkin lingkungan desktop dikonfigurasikan oleh distribusi Anda. Jika Anda masuk di bawah "sesi khusus", itu biasanya dijalankan ~/.xsession.

~/.bashrcadalah tempat yang tepat untuk pengaturan spesifik bash, seperti alias, fungsi, opsi shell, dan prompt. Seperti namanya, ini khusus untuk bash; csh memiliki ~/.cshrc, ksh memiliki ~/.kshrc, dan zsh memiliki <drumroll> ~/.zshrc.

Lihat juga:
Perbedaan antara .bashrc dan .bash_profile
File setup mana yang harus digunakan untuk mengatur variabel lingkungan dengan bash?
Zsh tidak memukul ~ /. Profil

Gilles
sumber
Jangan lupa zsh juga memiliki .zloginselain .zprofileyang berjalan setelah .zshrc (tetapi hanya untuk shell login). Lihat FAQ ZSH
Geeb
21

Tidak ada file umum, tetapi Anda dapat membuat setiap shell membaca dari file umum.

  1. bashmembaca dari .bash_profileatau.bashrc
  2. zshmembaca dari .zprofile dan .zshrc
  3. kshmembaca dari .profileatau$ENV

Jadi, inilah yang saya lakukan:

~/.env

# Put environment variables here, e.g.
PATH=$PATH:$HOME/bin

~/.shrc

test -f "$HOME/.env" && . "$HOME/.env"

# Put interactive shell setup here, e.g.
alias ll='ls -l'
PS1='$PWD$ '
set -o emacs

~/.bashrc

test -f ~/.shrc && source ~/.shrc

# Put any bash-specific settings here, e.g.
HISTFILE=~/.bash_history
shopt -s extglob
IGNOREEOF=yes

~/.zshenv

# Put any zsh-specific settings for non-interactive and interactive sessions, e.g.
setopt braceexpand
setopt promptsubst
setopt shwordsplit

~/.zshrc

test -f ~/.shrc && source ~/.shrc

# Put any zsh-specific interactive settings here, e.g.
HISTFILE=~/.zsh_history
setopt ignoreeof

~/.profile

# Interactive sub-shells source .env, unless this is bash or zsh,
# because they already sourced .env in .bashrc or .zshrc.
if test -z "$BASH_VERSION" -a -z "$ZSH_VERSION" || test -n "$BASH_VERSION" -a \( "${BASH##*/}" = "sh" \)
then
    test -f "$HOME"/.env && . "$HOME"/.env
fi

# The name is confusing, but $ENV is ksh's config file for interactive sessions,
# so it's equivalent to .bashrc or .zshrc.
# Putting this here makes running an interactive ksh from any login shell work.
test -f "$HOME"/.shrc && export ENV="$HOME"/.shrc

# Put any login shell specific commands here, e.g.
ssh-add
stty -ixon

~/.bash_profile

source ~/.bashrc
source ~/.profile

~/.zlogin

# zsh sources .zshrc automatically, only need to source .profile
source ~/.profile

~/.zprofile

(empty)

Jika Anda memiliki akses root ke sistem, cara lain adalah mengatur pam_env.

Anda bisa meletakkannya

session optional pam_env.so user_envfile=.env

dalam /etc/pam.dfile yang relevan (misalnya /etc/pam.d/common-sessionpada Debian), dan kemudian ketika pengguna masuk, PAMakan membaca variabel lingkungan dari ~/.env.

Perhatikan bahwa pam_envpada dasarnya hanya mendukung VAR=valueentri.

Info lebih lanjut:

Mikel
sumber
14

Tidak ada yang namanya file konfigurasi lingkungan untuk shell yang berbeda, karena itu bahkan shell yang spesifik bagaimana mereka didefinisikan.

Di csh Anda gunakan setenvdalam bash yang Anda gunakan exportuntuk mendefinisikan mereka.

Pokoknya Anda bisa menulis file konfigurasi Anda sendiri dan memasukkannya ke sourcedalam dotfiles dari shell Anda.

echox
sumber