GNU/Linux >> Belajar Linux >  >> Linux

Apa Cara Distro/shell-agnostik Terbaik Untuk Mengatur Variabel Lingkungan?

Pertanyaannya mengatakan itu semua. Saat ini saya menggunakan Arch Linux dan zsh, tetapi saya ingin solusi yang (minimal) berfungsi baik di VT maupun di xterms dan juga (semoga, lebih disukai) akan terus berfungsi jika saya mengganti distro atau shell.

Saya telah mendengar jawaban yang sangat berbeda untuk pertanyaan ini di dokumen distro yang berbeda. Ubuntu mengatakan "gunakan .pam_environment". Saya pikir di Arch apa yang mereka rekomendasikan tergantung pada Shell Anda. Saat ini saya meletakkan semuanya di .profile dan jika shell tidak menyediakannya karena alasan tertentu (mis. bash jika .bash_profile ada), saya menimpanya dengan mengambilnya secara manual. Tapi sepertinya harus ada cara yang lebih baik.

Jawaban yang Diterima:

Sayangnya tidak ada lokasi yang sepenuhnya portabel untuk mengatur variabel lingkungan. Dua file yang paling dekat adalah ~/.profile , yang merupakan lokasi tradisional dan berfungsi dengan baik di banyak penyiapan, dan ~/.pam_environment , alternatif yang modern, biasa tetapi terbatas.

Apa yang harus dimasukkan ke dalam ~/.pam_environment

File ~/.pam_environment dibaca oleh semua metode login yang menggunakan PAM dan yang mengaktifkan file ini. Ini mencakup sebagian besar sistem Linux saat ini.

Keuntungan utama ~/.pam_environment adalah bahwa (bila diaktifkan) dibaca sebelum shell pengguna dimulai, sehingga berfungsi terlepas dari jenis sesi, shell login, dan kerumitan lainnya. Ia bahkan bekerja untuk login non-interaktif seperti su -c somecommand dan ssh somecommand .

Batasan utama ~/.pam_environment adalah Anda hanya dapat meletakkan tugas sederhana di sana, bukan sintaksis shell yang rumit. Sintaks file ini adalah sebagai berikut.

  • File diurai baris demi baris.
  • Setiap baris harus memiliki bentuk VAR=VALUE di mana VAR terdiri dari huruf, angka, dan garis bawah. Bentuk alternatif VAR DEFAULT=value memungkinkan perluasan variabel lingkungan menggunakan ${VAR} sintaks dan variabel khusus @{HOME} dan @{SHELL} .
  • # memulai komentar, itu tidak dapat muncul dalam nilai.
  • Jika VALUE dikelilingi oleh " , lalu VAR disetel ke string di antara tanda kutip.
  • $ atau @ masukkan $ liter literal atau @ dan antrean panjang dapat dipisahkan dengan keluar dari baris baru dengan .
  • Jika ada kesalahan sintaks seperti tidak ada = atau spasi putih tanpa tanda kutip, variabel akan dihapus dari lingkungan.

Jadi sisi baiknya, ~/.pam_environment bekerja dalam berbagai macam keadaan. Pada sisi negatifnya, Anda tidak dapat menggunakan output dari suatu perintah (misalnya menguji apakah ada direktori atau program), dan beberapa karakter (#" , baris baru) tidak mungkin atau sulit untuk dimasukkan ke dalam nilai.

Apa yang harus dimasukkan ke dalam ~/.profile

File ini harus memiliki sintaks sh portabel (POSIX). Hanya gunakan ekstensi ksh atau bash (array, [[ … ]] , dll.) jika Anda tahu bahwa sistem Anda memiliki shell ini sebagai /bin/sh .

File ini dapat dibaca oleh skrip dalam aplikasi otomatis, sehingga tidak boleh memanggil program yang menghasilkan output apa pun atau memanggil exec . Jika Anda ingin melakukannya pada login mode teks, lakukan hanya untuk shell interaktif. Contoh:

case $- in *i*)
  # Display a message if I have new mail
  if mail -e; then echo 'You have new mail'; fi
  # If zsh is available, and this looks like a text-mode login, run zsh
  case "`ps $PPID` " in
    *" login "*)
      if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
  esac
esac

Ini adalah contoh penggunaan /bin/sh sebagai shell login Anda dan beralih ke shell favorit Anda. Lihat juga bagaimana saya bisa menggunakan bash sebagai shell login saya ketika sysadmin saya menolak untuk membiarkan saya mengubahnya

Terkait:Bagaimana cara mengatur kombinasi tombol seluruh sistem untuk mengaktifkan pengaturan System Preferences tertentu ("Ketuk untuk Mengklik")?

Kapan ~/.profile tidak terbaca pada login non-grafis?

Shell login yang berbeda membaca file yang berbeda.

Jika shell login Anda adalah bash

Bash membaca ~/.bash_login atau ~/.bash_profile jika ada, bukan ~/.profile . Juga bash tidak membaca ~/.bashrc dalam shell login meskipun interaktif. Agar tidak perlu mengingat kebiasaan ini lagi, buat ~/.bash_profile dengan dua baris berikut:

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

Jika shell login Anda adalah zsh

Zsh membaca ~/.zprofile dan ~/.zlogin , tapi bukan ~/.profile . Zsh memiliki sintaks yang berbeda dari sh, tetapi dapat membaca ~/.profile dalam mode emulasi sh. Anda dapat menggunakan ini untuk ~/.zprofile . Anda :

emulate sh -c '. ~/.profile'

Jika shell login Anda adalah shell lain

Tidak banyak yang dapat Anda lakukan di sana, selain menggunakan /bin/sh sebagai shell login Anda dan shell favorit Anda (seperti ikan) sebagai shell interaktif saja. Itulah yang saya lakukan dengan zsh. Lihat di atas untuk contoh memanggil shell lain dari ~/.profile .

Perintah jarak jauh

Saat menjalankan perintah jarak jauh tanpa melalui shell interaktif, tidak semua shell membaca file startup.

Ksh membaca file yang ditentukan oleh ENV variabel, jika Anda berhasil melewatinya.

Bash membaca ~/.bashrc jika tidak interaktif (!) dan proses induknya disebut rshd atau sshd . Jadi Anda dapat memulai ~/.bashrc dengan

if [[ $- != *i* ]]; then
  . ~/.profile
  return
fi

Zsh selalu membaca ~/.zshenv ketika itu dimulai. Gunakan dengan hati-hati, karena ini dibaca oleh setiap instance zsh, bahkan jika itu adalah subkulit tempat Anda menyetel variabel lain. Jika zsh adalah shell login Anda dan Anda ingin menggunakannya untuk mengatur variabel hanya untuk perintah jarak jauh, gunakan penjaga:setel beberapa variabel di ~/.profile , seperti MY_ENVIRONMENT_HAS_BEEN_SET=yes , dan periksa penjaga ini sebelum membaca ~/.profile .

if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi

Kasus login grafis

Banyak distribusi, pengelola tampilan, dan lingkungan desktop diatur untuk menjalankan ~/.profile , baik dengan mengambilnya secara eksplisit dari skrip startup atau dengan menjalankan shell login.

Sayangnya, tidak ada metode umum untuk menangani kombinasi distro/DM/DE di mana ~/.profile tidak dibaca.

Jika Anda menggunakan sesi tradisional yang dimulai dengan ~/.xsession , ini adalah tempat di mana Anda harus mengatur variabel lingkungan Anda; lakukan dengan sumber ~/.profile (yaitu . ~/.profile ). Perhatikan bahwa dalam beberapa penyiapan, skrip startup lingkungan desktop akan menggunakan ~/.profile lagi.


Linux
  1. Cara Mengatur/Membuat Variabel Lingkungan dan Shell di Linux

  2. Perbedaan Penggunaan Antara Variabel Shell Dan Variabel Lingkungan?

  3. Apa Cara Terbaik Untuk Menghitung Jumlah File Dalam Direktori?

  1. Cara Mengambil Nama Lingkungan Desktop??

  2. Cara Terbaik Untuk Membatalkan Semua Pekerjaan Slurm Dari Keluaran Perintah Shell?

  3. Apa Cara Terbaik Untuk Membakar File Video Ke Dvd?

  1. Apa Cara Terbaik Untuk Mengambil Segmen Dari File Teks?

  2. Apakah Variabel Non-lingkungan Diteruskan Ke Subkulit Dipanggil Dengan Substitusi Perintah?

  3. Apa cara terbaik untuk mendistribusikan aplikasi biner untuk Linux?