Global bash_profile

20

Saya menyadari ada /etc/profiledan /etc/bashrcfile untuk mengatur variabel lingkungan global dan mungkin saya hanya salah paham tujuan mereka, tapi ...

Apakah ada bash_profilefile global ?

Saya menggunakan Mac OS X

Hubro
sumber

Jawaban:

15

Itu tidak dipanggil bash_profile, tetapi tempat standar untuk konfigurasi global bash adalah /etc/bash.bashrc. Biasa disebut ini /etc/profilejika shellnya bash. Misalnya, di saya, /etc/profilesaya punya:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1=’0
    if [ f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  fi
fi

Dalam hal penggunaan, /etc/profilemenyediakan konfigurasi seluruh sistem untuk semua shell Bourne yang kompatibel (sh, bash, ksh, dll.). Biasanya tidak diperlukan untuk yang setara /etc/bash_profile, karena maksud dari file profil adalah untuk mengontrol perilaku shell masuk. Biasanya apa pun yang ingin Anda lakukan di sana tidak akan spesifik untuk bash. /etc/bash.bashrckhusus untuk bash, dan akan dijalankan untuk shell login maupun non-login.

Untuk lebih rumit, sepertinya OS X bahkan tidak punya /etc/bash.bashrc. Ini mungkin terkait dengan fakta bahwa Terminal di OS X default untuk berjalan sebagai shell login , sehingga perbedaannya hilang:

Pengecualian untuk pedoman jendela terminal adalah Terminal.app Mac OS X, yang menjalankan shell login secara default untuk setiap jendela terminal baru, dengan memanggil .bash_profile alih-alih .bashrc. Emulator terminal GUI lain mungkin melakukan hal yang sama, tetapi kebanyakan cenderung tidak.

Saya tidak menjalankan OS X, jadi sejauh pengetahuan saya berakhir di sana.

ire_and_curses
sumber
Jangan membaca /etc/bash.bashrcdari shell yang tidak interaktif. /etc/profiledapat dibaca oleh shell non-interaktif. Lihat Perbedaan antara Shell Login dan Shell Non-Login?
Gilles 'SO- stop being evil'
@Gilles - Saya tidak jelas poin apa yang ingin Anda sampaikan di sini. Shell login non-interaktif memang merupakan hal yang tidak biasa. Sebagai referensi, kode yang saya kutip bukan ciptaan saya sendiri. Itu dari default /etc/profiledi Ubuntu 12.04. Apa yang akan Anda sarankan jika seseorang menginginkan /etc/profileyang dieksekusi hanya di bawah bash, dan tidak ada shell yang kompatibel dengan sh lainnya?
ire_and_curses
Sistem /etc/profilefile untuk sistem saya berisi komentar di bagian atas yang berbunyi: # System-wide .profile for sh(1). Apakah rata profile- rata ini shspesifik? Apakah shentah bagaimana berjalan sebelumnya bash?
@ Josh Voigts - shadalah bagian dari bash. /etc/profiledieksekusi untuk sh,, bashdan semua shell yang kompatibel dengan Bourne.
ire_and_curses
@ire_and_curses Tampaknya file dipanggil /etc/bashrcdi mac, bukan /etc/bash.bashrc. Tampaknya juga berjalan untuk /bin/sh.
BrainStorm.exe
4

/etc/profileadalah global bash_profile. Tidak ada file yang spesifik untuk bash, bash hanya membaca file standar yang dibaca oleh semua shell Bourne-style. Di situlah Anda dapat mengatur variabel lingkungan sistem-lebar.

Lihat Apakah ada file setara ".bashrc" yang dibaca oleh semua shell? untuk tinjauan umum tentang file startup umum bash.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

Setup Interactive Shell (Bash) Secara global

Ini tidak memuat /etc/profile, jadi tidak ada dalam/etc/profile.d/ dimuat (tidak seperti shell login, lihat akhirnya).

File global untuk ini adalah / etc / bashrc atau /etc/bash.bashrc (tergantung pada -DSYS_BASHRC=flag yang ditetapkan pada waktu kompilasi):

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

Biasanya adalah ide yang baik untuk membiarkan file ini apa adanya (sebanyak mungkin) untuk menghindari konflik. Strategi yang saya gunakan mirip dengan yang digunakan shell (/ etc / profile).

Strategi saya adalah menambahkan loader ke file di atas:

# Add new directory analog to /etc/profile.d
mkdir /etc/bashrc.d

# Write the loader to /etc/bash.bashrc (it might be /etc/bashrc on as mentioned above)
cat >> /etc/bash.bashrc << 'EOF'
# I appended this: Load scripts from /etc/bashrc.d
if test -d /etc/bashrc.d; then
  for script in /etc/bashrc.d/*.sh; do
    test -r "$script" && . "$script"
  done
  unset item
fi
EOF

Sekarang saya dapat dengan mudah menambahkan n kustomisasi ke file shell global interaktif (bash) dengan memasukkan .shfiles baru ke direktori /etc/bashrc.d.

Warnai Grep Secara Global

/etc/bashrc.d/grep.sh

alias grep='grep --color=auto'

Anda dapat melakukan ini dengan liner satu ini:

printf "alias grep=\'grep --color=auto\'" > /etc/bashrc.d/grep.sh

Bandingkan profile.d vs bashrc.d

Jika, setelah membaca ini, Anda tetap tidak yakin, lakukan ini untuk meyakinkan diri sendiri:

printf "alias grep=\'grep --color=auto\'" > /etc/profile.d/grep.sh

Buka emulator terminal baru dan cari beberapa kata umum di direktori pengguna Anda seperti "the" menggunakan grep

grep -r 'the'

Tidak ada yang harus diwarnai. Lakukan hal yang sama di konsol virtual dengan melakukan CTRLALTF1 (ingat bahwa server X Anda mungkin berjalan di CTRLALTF7 sehingga Anda dapat beralih kembali. Jika Anda lupa, cukup restart desktop manager Anda, misalnya)

grep -r 'the' 

akan menghasilkan hasil berwarna seperti yang diinginkan.

Tidak ada yang harus diwarnai. Lakukan hal yang sama di konsol virtual dengan melakukan CTRLALTF1(ingat bahwa server X Anda mungkin berjalan pada CTRLALTF7sehingga Anda dapat beralih kembali. Jika Anda lupa, cukup restart manajer desktop Anda, misalnya)

grep -r 'the' 

akan menghasilkan hasil berwarna seperti yang diinginkan.

Sebuah shell login adalah apa yang Anda dapatkan ketika Anda boot mesin atau switch konsol virtual dengan CTRLALTF1melaluiFNth virtual konsol virtual.

Login Shell memuat /etc/profilesambil memuat /etc/profile.d/*.shfile.

Jonathan Komar
sumber