Memahami .bashrc dan .bash_profile

26

Di server ketika saya login sebagai root saya melihat .bashrc(Ubuntu 10.10).

Di Mac saya, saya punya .bash_profile

Apakah Ubuntu selalu hanya memiliki .bashrcfile dan tidak .bash_profile? (Aku hanya bingung, jadi bertanya, aku sadar mereka berbeda, tapi mungkin ada hubungan entah bagaimana?)

Di server saya, saya ingin membuat alias, haruskah saya memasukkannya .bashrc?

Bagaimana jika saya ingin alias ini diterapkan sehingga semua pengguna dapat menggunakannya?

Blankman
sumber
1
mungkin duplikat dari: askubuntu.com/questions/1528/bashrc-or-bash-profile - Saya sarankan Anda untuk mengubah pertanyaan Anda untuk hanya bertanya di mana harus meletakkan alias secara global.

Jawaban:

39

Alias ​​Bash harus masuk .bash_aliasesatau .bashrcfile dalam direktori home masing-masing. Jika Anda harus membuat alias global bash, mereka bisa masuk /etc/bash.bashrc, tetapi sering kali lebih baik menambahkannya ke file .bash_aliasesatau .bashrcdi /etc/skelsehingga mereka diwarisi oleh pengguna yang baru dibuat.

Hal ini hampir selalu salah untuk mendefinisikan alias di dalam .profile, .bash_profileatau /etc/profile.

Untuk memahami alasannya, seseorang harus memahami dalam situasi apa perintah dari masing-masing file ini dijalankan. Ada kesalahpahaman tentang ini, yang saya bahas di bawah ini.

Meskipun Anda ingin mendefinisikan alias untuk banyak pengguna, Anda harus terbiasa dengan bagaimana mereka didefinisikan untuk masing-masing pengguna, sehingga Anda dapat memutuskan metode terbaik untuk melakukan apa yang Anda butuhkan.

Alias ​​untuk Pengguna Perorangan

Terutama jika Anda menggunakan GUI, sebagian besar kerang interaktif Anda mungkin non-login . Bahkan jika Anda tidak pernah menggunakan GUI, Anda mungkin masih menggunakan shell non-login dengan frekuensi tertentu. Anda ingin alias Anda berfungsi di shell ini.

Terutama jika Anda pernah masuk secara non-grafis di a konsol virtual atau melalui SSH , Anda mungkin sering menggunakan shell login. Jadi, Anda juga ingin alias Anda berfungsi di shell login interaktif.

Ketika shell interaktif, non-login dimulai , itu sumber.bashrc di direktori home pengguna. Secara default di Ubuntu, setiap pengguna itu .bashrcsendiri sumber .bash_aliases, jika ada.

  • Untuk sumber file adalah untuk menyebabkan isinya yang akan dijalankan di saat shell. Perubahan pada lingkungan shell yang dibuat dalam file yang bersumber tetap ada bahkan setelah semua perintah dalam file telah dijalankan.

Membaca komentar dalam default Ubuntu .bashrcmengungkapkan bahwa secara resmi dimaksudkan alias masuk .bashrcatau .bash_aliases. .bashrcsudah mengandung beberapa definisi alias (jalankangrep '^[[:blank:]]*alias' ~/.bashrc untuk melihatnya), dan memberikan saran eksplisit tentang di mana harus menempatkan definisi baru tersebut:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Tapi bagaimana dengan shell login interaktif ? Dari pada.bashrc , login sumber shells .profile.

  • ... Kecuali .bash_loginada, maka itu akan bersumber.
  • ... Kecuali .bash_profileada, maka itu akan bersumber.

Namun, kabar baiknya adalah bahwa secara default di Ubuntu, perintah di juga.bashrc akan berjalan di shell login interaktif karena default .profilememeriksa apakah shell saat ini adalah bash (dan jika .bashrcada), dan jika demikian, sumber .bashrc:

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

Saya menyarankan pengguna mendefinisikan alias bash baru di .bash_aliasesdalam direktori home mereka (membuatnya jika belum ada). Ini adalah cara yang sangat bersih dan sederhana untuk membuat definisi alias permanen di tingkat per pengguna.

Alias tidak boleh didefinisikan.profile karena mereka akan tetap tidak terdefinisi dalam shell non-login. Tidak seperti kebanyakan lingkungan bash shell, alias tidak diekspor ke shell anak:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

Secara khusus, secara default sebagian besar lingkungan desktop menyebabkan .profile bersumber pada login grafis, tetapi:

  1. Ini belum tentu dilakukan oleh bash shell, jadi definisi alias bahkan mungkin tidak diproses, dan yang lebih penting
  2. bahkan jika definisi alias diproses, mereka tidak diteruskan ke proses anak . Khususnya, mereka tidak diteruskan ke shell yang dibuat dengan membuka jendela Terminal!

Alias ​​tidak boleh didefinisikan dalam .bash_profile(atau .bash_login) karena alasan yang sama, tetapi juga karena alasan lain. Naif membuat salah satu dari file-file ini dan menempatkan adil alias definisi dalam mencegah salah kode di .profiledari berjalan!

Dalam situasi di mana .bash_profileatau .bash_loginbenar - benar bermanfaat, biasanya satu sumber .profiledi suatu tempat di dalamnya, yang memecahkan masalah itu. (Maka satu-satunya masalah yang tersisa adalah bahwa, seperti dengan .profile, mendefinisikan alias di.bash_profile atau .bash_logintidak berfungsi dengan benar.)

Alias ​​untuk Baru Pengguna Perorangan , Secara Otomatis

Ketika akun pengguna dari jenis yang dimaksudkan untuk mewakili manusia nyata dibuat, direktori baru biasanya dibuat untuk berfungsi sebagai direktori rumah mereka. Konten /etc/skeltersebut kemudian disalin ke direktori home mereka. Ini adalah bagaimana banyak pengguna memulai dengan beberapa file konfigurasi serupa di direktori home mereka. Di Ubuntu, ini termasuk .profile,.bashrc , dan beberapa file lainnya.

Untuk mengubah alias apa yang didefinisikan untuk pengguna baru, Anda cukup memasukkannya /etc/skel/.bash_aliases(Anda harus membuatnya) atau /etc/skel/.bashrc.

Jika Anda mengedit file yang sudah ada di dalam, /etc/skelAnda mungkin ingin mencadangkannya terlebih dahulu - tetapi Anda tidak boleh memasukkan cadangannya /etc/skel, atau file itu juga, akan disalin ke direktori home pengguna baru.

Ini mungkin cara terbaik bagi Anda untuk menambahkan alias baru untuk banyak pengguna. Pengguna yang sudah ada cukup menambahkan alias sendiri. Jika Anda mendefinisikan alias di /etc/skel/.bash_aliasesdalamnya, Anda bisa mengarahkan mereka ke file itu, yang dapat mereka pilih untuk disalin ke direktori home mereka (atau menambahkan ke .bash_aliasesfile kustom mereka sendiri ).

Sepele bagi pengguna untuk tidak mendefinisikan alias. Selain itu, alias tidak terlalu kuat ; mereka hanya bekerja dalam keadaan tertentu. Jika Anda perlu membuat perintah baru yang berfungsi setiap saat, untuk semua orang , Anda tidak boleh mengimplementasikan perintah itu sebagai alias. Dan Anda tidak bisa berhasil memaksakan alias pada pengguna yang tidak menginginkannya - mereka bisa saja unaliasmereka.

Alias ​​Global, untuk Semua Pengguna

Meskipun saya menyarankan Anda untuk menghindari pendekatan ini, Anda dapat mendefinisikan alias di file global /etc/bash.bashrc . Mereka kemudian akan didefinisikan untuk shell non-login interaktif dan untuk shell login interaktif. Alasannya adalah, sebelum ada file di direktori home pengguna yang bersumber:

  • Shell login (dan hanya shell login dan proses lain yang berperilaku seperti shell login) menjalankan perintah dari /etc/profilesecara otomatis.
  • Hanya shell non-login yang menjalankan perintah /etc/bash.bashrcsecara otomatis, tetapi
  • Default Ubuntu /etc/profilememeriksa apakah shell yang dijalankan adalah bash (dan jika /etc/bash.bashrcada) dan, jika demikian, sumber /etc/bash.bashrc.

Ini analog dengan bagaimana sumber per pengguna default per .profilepengguna .bashrcjika shell adalah bash (seperti yang dijelaskan di atas).

Begini seperti apa kode sebenarnya untuk ini di default /etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

Blok itu juga melakukan tugas-tugas lain. Secara khusus, bagian luar ifmemeriksa apakah shell cenderung interaktif (dengan memeriksa bahwa teks prompt tidak kosong), kemudian memeriksa apakah shell saat ini adalah bash dan sumber /etc/bash.bashrcjika itu, dan jika tidak melakukan beberapa pekerjaan itu, untuk bash , sudah dilakukan di/etc/bash.bashrc .

Anda tidak boleh mendefinisikan alias global /etc/profilekarena alasan yang sama pengguna tidak harus mendefinisikannya di lokal mereka.profile : jika Anda melakukannya, mereka akan ditentukan hanya untuk shell login, dan bukan untuk shell anak mereka.

Akhirnya, perhatikan bahwa, tidak seperti default per-pengguna .bashrc, /etc/bash.bashrcfile default tidak mengandung apa pun tentang alias. Agak tidak lazim untuk memberikan alias kepada pengguna dalam file di mana mereka tidak dapat mengedit atau menonaktifkannya. (Tentu saja, mereka masih bisa melakukan itu, dengan menimpa definisi mereka di daerah mereka sendiri .bashrc, .bash_aliasesatau di tempat lain.)

Bacaan lebih lanjut

Eliah Kagan
sumber
5

Ini bacaan yang bagus . ".bash_profile dieksekusi untuk shell login, sedangkan .bashrc dieksekusi untuk shell non-login interaktif"

Jadi untuk alias Anda, gunakan .bash_profile

geermc4
sumber
4
Memasukkan alias .bash_profiletidak benar. Di Ubuntu, .profile(yang berjalan untuk shell login) sumber .bashrcketika itu adalah shell bash interaktif. Dengan demikian menempatkan alias di .bashrc(atau .bash_aliases, bersumber di .bashrc) mendefinisikan mereka di semua shell pesta interaktif. Alias ​​dalam .bash_profilemenghasilkan masalah ini , antara lain. Lihat ini , itu , jawaban saya , dan ~/.bashrckomentar default merekomendasikan memasukkan alias di sana atau di .bash_aliases.
Eliah Kagan