Ketika berinteraksi dengan server Anda melalui sesi shell, ada banyak potongan informasi yang dikumpulkan shell untuk menentukan perilaku dan aksesnya ke sumber daya. Sebagian dari pengaturan ini terkandung dalam pengaturan konfigurasi dan yang lainnya ditentukan oleh masukan pengguna.
Salah satu cara agar shell melacak semua pengaturan dan detail ini adalah melalui suatu area yang dikelolanya, yang disebut lingkungan. Lingkungan adalah area yang dibangun shell setiap kali shell memulai sesi yang mengandung variabel yang mendefinisikan properti sistem.
Dalam panduan ini, kita akan membahas cara berinteraksi dengan lingkungan dan membaca atau mengatur variabel lingkungan dan shell secara interaktif dan melalui berkas konfigurasi.
Setiap kali sesi shell dimulai, suatu proses berlangsung untuk mengumpulkan dan mengompilasi semua informasi yang seharusnya tersedia bagi proses shell dan proses anaknya. Proses tersebut mendapatkan data untuk pengaturan ini dari berbagai berkas dan pengaturan berbeda pada sistem.
Lingkungan menyediakan medium yang mana proses shell bisa mendapatkan atau mengatur pengaturan melaluinya, dan pada gilirannya memberikan ini ke proses anaknya.
Lingkungan diimplementasikan sebagai string yang mewakili pasangan kunci-nilai. Jika banyak nilai diberikan, mereka biasanya akan dipisahkan dengan tanda karakter titik dua (:
). Setiap pasang biasanya akan terlihat seperti ini:
KEY=value1:value2:...
Jika nilainya berisi spasi kosong yang signifikan, tanda kutip akan digunakan:
KEY="value with spaces"
Kunci dari skenario ini adalah variabel. Variabel ini berupa salah satu dari dua jenis, variabel lingkungan atau variabel shell.
Variabel lingkungan adalah variabel yang didefinisikan untuk shell saat ini dan diwarisi oleh shell atau proses anak apa pun. Variabel lingkungan digunakan untuk memasukkan informasi ke dalam proses yang dihasilkan dari shell.
Variabel shell adalah variabel yang terkandung secara eksklusif di dalam shell tempat variabel tersebut diatur atau didefinisikan. Variabel ini sering digunakan untuk melacak data yang hanya bertahan sebentar, seperti direktori kerja yang aktif saat ini.
Berdasarkan konvensi, jenis variabel ini biasanya didefinisikan dengan menggunakan huruf kapital semua. Ini membantu pengguna untuk membedakan variabel lingkungan di dalam konteks lainnya.
Setiap sesi shell terus melacak variabel shell dan lingkungannya sendiri. Kita dapat mengakses variabel ini dengan beberapa cara yang berbeda.
Kita dapat melihat daftar semua variabel lingkungan kita dengan perintah env
atau printenv
. Dalam kondisi asalinya, perintah ini seharusnya berfungsi sama:
- printenv
OutputSHELL=/bin/bash
TERM=xterm
USER=demouser
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca:...
MAIL=/var/mail/demouser
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PWD=/home/demouser
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/demouser
LOGNAME=demouser
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/printenv
Ini adalah tipikal keluaran dari printenv
dan env
. Perbedaan antara dua perintah ini hanya terlihat dalam fungsionalitasnya yang lebih spesifik. Misalnya, dengan printenv
, Anda dapat meminta nilai dari masing-masing variabel:
- printenv SHELL
Output/bin/bash
Di sisi lain, env
memungkinkan Anda memodifikasi lingkungan tempat program berjalan dengan memberi suatu set definisi variabel ke perintah seperti ini:
- env VAR1="value" command_to_run command_options
Seperti kita pelajari di atas, karena proses anak biasanya mewarisi variabel lingkungan dari proses induk, ini memberi Anda kesempatan untuk menimpa nilai atau menambah variabel tambahan untuk anaknya.
Seperti yang Anda lihat dari keluaran perintah printenv
kita, ada beberapa variabel lingkungan yang disiapkan melalui berkas sistem dan proses tanpa masukan kita.
Ini menunjukkan variabel lingkungan, tetapi bagaimana kita melihat variabel shell?
Perintah set
dapat digunakan untuk ini. Jika kita mengetik set
tanpa parameter tambahan, kita akan mendapatkan daftar dari semua variabel shell, variabel lingkungan, variabel lokal, dan fungsi shell:
- set
OutputBASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
. . .
Ini biasanya merupakan daftar yang besar. Anda mungkin ingin memasukkannya ke dalam program pager sehingga dapat lebih mudah menangani jumlah keluaran yang besar ini:
- set | less
Jumlah informasi tambahan yang kita terima agak berlebihan. Kita mungkin tidak perlu tahu semua fungsi bash yang didefinisikan, misalnya.
Kita dapat membersihkan keluaran dengan menentukan bahwa set
seharusnya beroperasi dalam mode POSIX, yang tidak akan mencetak fungsi shell. Kita dapat mengeksekusinya dalam subshell sehingga ini tidak mengubah lingkungan kita saat ini:
- (set -o posix; set)
Ini akan membuat daftar dari semua variabel lingkungan dan shell yang didefinisikan.
Kita dapat mencoba untuk membandingkan keluaran ini dengan keluaran dari perintah env
atau printenv
untuk mencoba mendapatkan daftar dari variabel shell saja, tetapi ini akan menjadi tidak sempurna karena perintah-perintah ini memiliki cara yang berbeda untuk menampilkan keluaran informasi:
- comm -23 <(set -o posix; set | sort) <(env | sort)
Kemungkinan ini akan tetap menyertakan beberapa variabel lingkungan, mengingat nilai yang dikutip oleh keluaran perintah set
, sementara perintah printenv
dan env
tidak mengutip nilai-nilai string.
Ini seharusnya tetap memberi Anda ide yang bagus tentang variabel lingkungan dan shell yang diatur dalam sesi Anda.
Variabel ini digunakan untuk segala macam hal. Mereka memberikan cara alternatif untuk mengatur nilai-nilai persisten pada sesi di antara berbagai proses, tanpa membuat perubahan terhadap berkas.
Sebagian variabel lingkungan dan shell sangat berguna dan cukup sering direferensikan. Berikut adalah beberapa variabel lingkungan umum yang Anda akan jumpai:
SHELL
: Ini mendeskripsikan shell yang akan menginterpretasikan perintah apa pun yang Anda ketik. Dalam kebanyakan kasus, ini adalah bash secara asali, tetapi nilai lain dapat ditetapkan jika Anda lebih memilih opsi lainnya.TERM
: Ini menentukan jenis terminal untuk menjalankan emulasi saat menjalankan shell. Terminal perangkat keras yang berbeda dapat diemulasi untuk kebutuhan pengoperasian yang berbeda. Anda biasanya tidak perlu khawatir tentang hal ini.USER
: Pengguna yang sedang log masuk saat ini.PWD
: Direktori kerja saat ini.OLDPWD
: Direktori kerja sebelumnya. Ini disimpan oleh shell agar Anda dapat beralih kembali ke direktori sebelumnya dengan menjalankan cd -
.LS_COLORS
: Ini mendefinisikan kode warna yang digunakan untuk menambahkan keluaran berwarna secara opsional ke perintah ls
. Ini digunakan untuk membedakan jenis berkas yang berbeda dan memberikan lebih banyak informasi kepada pengguna secara sekilas.MAIL
: Jalur ke kotak surat pengguna saat ini.PATH
: Daftar direktori yang diperiksa sistem saat mencari perintah. Ketika pengguna mengetik perintah, sistem akan memeriksa direktori dengan urutan seperti ini untuk mencari perintah yang dapat dieksekusi.LANG
: Pengaturan bahasa dan lokalisasi saat ini, termasuk pengodean karakter.HOME
: Direktori rumah pengguna saat ini._
: Perintah terbaru yang dieksekusi sebelumnya.Selain variabel lingkungan ini, beberapa variabel shell yang Anda akan sering lihat adalah:
BASHOPTS
: Daftar opsi yang digunakan saat bash dieksekusi. Ini dapat berguna untuk mencari tahu apakah lingkungan shell akan beroperasi dengan cara yang Anda inginkan.BASH_VERSION
: Versi bash yang sedang dieksekusi, dalam bentuk yang dapat dibaca manusia.BASH_VERSINFO
: Versi bash, dalam keluaran yang dapat dibaca mesin.COLUMNS
: Jumlah lebar kolom yang sedang digunakan untuk menampilkan keluaran di layar.DIRSTACK
: Tumpukan direktori yang tersedia dengan perintah pushd
dan popd
.HISTFILESIZE
: Histori jumlah baris dari perintah yang disimpan ke berkas.HISTSIZE
: Riwayat jumlah baris dari perintah yang diizinkan dalam memori.HOSTNAME
: Nama hos dari komputer saat ini.IFS
: Pemisah bidang internal untuk memisahkan masukan di baris perintah. Secara asali, ini adalah spasi.PS1
: Definisi prompt perintah primer. Ini digunakan untuk mendefinisikan tampilan prompt saat Anda memulai sesi shell. PS2
digunakan untuk menyatakan prompt sekunder saat perintah terdiri dari beberapa baris perintah.SHELLOPTS
: Opsi shell yang dapat diatur dengan opsi set
.UID
: UID dari pengguna saat ini.Untuk lebih memahami perbedaan antara variabel shell dan lingkungan, serta untuk memperkenalkan sintaks untuk pengaturan variabel ini, kita akan melakukan demonstrasi kecil.
Kita akan mulai dengan mendefinisikan variabel shell di dalam sesi kita saat ini. Ini mudah untuk dilakukan; kita hanya perlu menentukan nama dan nilai. Kita akan mengikuti konvensi menggunakan huruf besar untuk nama variabel, dan mengaturnya ke string sederhana.
- TEST_VAR='Hello World!'
Di sini, kita telah menggunakan kutipan karena nilai variabel kita mengandung spasi. Lebih jauh lagi, kita telah menggunakan tanda kutip tunggal karena tanda seru adalah karakter khusus di dalam shell bash yang biasanya mengembang ke riwayat bash jika tombol Esc tidak ditekan atau dimasukkan ke dalam kutipan tunggal.
Sekarang kita memiliki variabel shell. Variabel ini tersedia di sesi kita saat ini, tetapi tidak akan diberikan ke proses anak.
Kita dapat melihatnya dengan mencari variabel baru kita menggunakan grep di dalam keluaran set
:
- set | grep TEST_VAR
OutputTEST_VAR='Hello World!'
Kita dapat memverifikasi bahwa ini bukan variabel lingkungan dengan mencoba hal yang sama menggunakan printenv
:
- printenv | grep TEST_VAR
Seharusnya tidak ada keluaran yang dihasilkan.
Mari kita anggap ini sebagai kesempatan untuk menunjukkan cara mengakses nilai dari variabel shell atau lingkungan apa pun.
- echo $TEST_VAR
OutputHello World!
Seperti yang Anda lihat, lakukan referensi nilai variabel dengan mengawalinya menggunakan tanda $
. Shell menganggap ini berarti shell harus mengganti nilai variabel saat menjumpainya.
Jadi kini kita memiliki variabel shell. Ini seharusnya tidak diberikan ke proses anak apa pun. Kita dapat menghasilkan shell bash yang baru dari dalam shell bash kita saat ini untuk menunjukkan:
- bash
- echo $TEST_VAR
Jika kita mengetik bash
untuk menghasilkan shell anak, lalu mencoba untuk mengakses konten dari variabel, tidak akan ada yang ditampilkan. Inilah yang kita harapkan.
Kembalilah ke shell asli kita dengan mengetik exit
:
- exit
Sekarang, mari kita ubah variabel shell menjadi variabel lingkungan. Kita dapat melakukannya dengan mengekspor variabel. Perintah untuk melakukannya dinamakan:
- export TEST_VAR
Ini akan mengubah variabel kita menjadi variabel lingkungan. Kita dapat memeriksanya dengan memeriksa daftar lingkungan kita lagi:
- printenv | grep TEST_VAR
OutputTEST_VAR=Hello World!
Kali ini, variabel kita muncul. Mari kita coba eksperimen kita dengan shell anak lagi:
- bash
- echo $TEST_VAR
OutputHello World!
Hebat! Shell anak kita telah menerima variabel yang diatur oleh induknya. Sebelum kita keluar dari shell anak ini, mari kita coba untuk mengekspor variabel lainnya. Kita dapat mengatur variabel lingkungan dalam satu langkah tunggal seperti ini:
- export NEW_VAR="Testing export"
Uji bahwa ini telah diekspor sebagai variabel lingkungan:
- printenv | grep NEW_VAR
OutputNEW_VAR=Testing export
Sekarang, mari kita keluar dan kembali ke shell asli kita:
- exit
Mari kita lihat apakah variabel baru tersedia:
- echo $NEW_VAR
Tidak ada yang ditampilkan.
Ini karena variabel lingkungan hanya diberikan ke proses anak. Tidak ada cara bawaan untuk mengatur variabel lingkungan dari shell induk. Ini adalah hal bagus dalam kebanyakan kasus dan mencegah program dari memengaruhi lingkungan operasi dari tempat mereka dipanggil.
Variabel NEW_VAR
telah diatur sebagai variabel lingkungan di dalam shell anak kita. Variabel ini akan tersedia untuk dirinya sendiri dan shell serta proses anak dari variabel ini. Ketika kita keluar dan kembali ke shell utama, lingkungan itu telah dihancurkan.
Kita masih memiliki variabel TEST_VAR
yang didefinisikan sebagai variabel lingkungan. Kita dapat mengubahnya kembali ke variabel shell dengan mengetik:
- export -n TEST_VAR
Ini bukan lagi variabel lingkungan:
- printenv | grep TEST_VAR
Namun, ini masih merupakan variabel shell:
- set | grep TEST_VAR
OutputTEST_VAR='Hello World!'
Jika kita ingin sepenuhnya menghapus pengaturan variabel, baik shell atau lingkungan, kita dapat melakukannya dengan perintah unset
:
- unset TEST_VAR
Kita dapat memverifikasi bahwa ini tidak lagi diatur:
- echo $TEST_VAR
Tidak ada yang dihasilkan karena variabel telah dihapus pengaturannya.
Kita telah menyebutkan bahwa banyak program menggunakan variabel lingkungan untuk memutuskan cara spesifik pengoperasian. Kita tidak ingin harus menyiapkan variabel penting setiap kali kita memulai sesi shell baru, dan kita telah melihat seberapa banyak variabel yang sudah diatur saat log masuk, jadi bagaimana cara membuat dan mendefinisikan variabel secara otomatis?
Ini sebenarnya adalah masalah yang lebih rumit daripada kelihatannya, karena banyak berkas konfigurasi yang dibaca shell bash tergantung cara sesi dimulai.
Shell bash membaca berkas konfigurasi yang berbeda tergantung pada cara sesi dimulai.
Satu perbedaan antara berbagai sesi adalah apakah shell dihasilkan sebagai sesi log masuk atau non-log masuk.
Shell log masuk adalah sesi shell yang dimulai dengan mengautentikasi pengguna. Jika Anda masuk ke sesi terminal atau melalui SSH dan mengautentikasi, sesi shell akan diatur sebagai shell log masuk.
Jika Anda memulai sesi shell baru dari dalam sesi yang terautentikasi, seperti yang kita lakukan dengan memanggil perintah bash
dari terminal, sesi shell non-log masuk akan dimulai. Anda tidak diminta detail autentikasi saat memulai shell anak.
Perbedaan lainnya yang dapat dibuat adalah bahwa sesi shell adalah interaktif atau non-interaktif.
Sesi shell interaktif adalah sesi shell yang melekat ke terminal. Sesi shell non-interaktif adalah sesi shell yang tidak melekat ke sesi terminal.
Jadi, setiap sesi shell diklasifikasikan baik sebagai log masuk atau non-log masuk dan interaktif atau non-interaktif.
Sesi normal yang dimulai dengan SSH biasanya merupakan shell log masuk interaktif. Skrip yang dijalankan dari baris perintah biasanya dijalankan dalam shell non-interaktif dan non-log masuk. Sesi terminal dapat berupa kombinasi dari dua properti ini.
Apakah sesi shell yang diklasifikasikan sebagai shell log masuk atau non-log masuk memiliki implikasi pada berkas yang dibaca untuk menginisialisasi sesi shell.
Sesi yang dimulai sebagai sesi log masuk akan membaca detail konfigurasi dari berkas /etc/profile
terlebih dahulu. Kemudian akan mencari berkas konfigurasi shell log masuk pertama di dalam direktori rumah pengguna untuk mendapatkan detail konfigurasi spesifik pengguna.
Sesi ini membaca berkas pertama yang dapat ditemukan dari ~/.bash_profile
, ~/.bash_login
, dan ~/.profile
serta tidak membaca berkas lainnya lebih jauh.
Sebaliknya, sesi yang didefinisikan sebagai shell non-log masuk akan membaca /etc/bash.bashrc
dan kemudian berkas spesifik pengguna ~/.bashrc
untuk membangun lingkungannya.
Shell non-interaktif membaca variabel lingkungan bernama BASH_ENV
dan membaca berkas yang ditentukan untuk mendefinisikan lingkungan baru.
Seperti yang Anda lihat, ada berbagai berkas berbeda yang biasanya kita perlu perhatikan untuk menyesuaikan pengaturan kita.
Ini memberikan banyak fleksibilitas yang dapat membantu dalam situasi spesifik saat kita menginginkan pengaturan tertentu dalam shell log masuk, dan pengaturan lainnya dalam shell non-log masuk. Namun, kita kebanyakan menginginkan pengaturan yang sama dalam kedua situasi.
Untungnya, kebanyakan distribusi Linux mengonfigurasi berkas konfigurasi log masuk untuk mengambil sumber dari berkas konfigurasi non-log masuk. Ini berarti bahwa Anda dapat mendefinisikan variabel lingkungan yang Anda inginkan dalam kedua situasi di berkas konfigurasi non-log masuk. Mereka kemudian akan dibaca dalam kedua skenario.
Kita biasanya akan mengatur variabel lingkungan spesifik pengguna, dan kita biasanya ingin pengaturan tersedia di dalam shell log masuk serta non-log masuk. Ini berarti bahwa tempat untuk mendefinisikan variabel ini ada di dalam berkas ~/.bashrc
.
Buka berkas ini sekarang:
- nano ~/.bashrc
Berkas ini kemungkinan besar sudah berisi sedikit data. Sebagian besar definisi di sini adalah untuk mengatur opsi bash, yang tidak berhubungan dengan variabel lingkungan. Anda dapat mengatur variabel lingkungan seperti yang Anda inginkan dari baris perintah:
- export VARNAME=value
Variabel lingkungan baru apa pun dapat ditambahkan di mana saja di dalam berkas ~/.bashrc
, selama mereka tidak ditempatkan di tengah perintah lainnya atau untuk loop. Kemudian, kita dapat menyimpan dan menutup berkas. Saat Anda memulai sesi shell berikutnya, pernyataan variabel lingkungan akan dibaca dan diberikan ke lingkungan shell. Anda dapat memaksa sesi saat ini untuk membaca berkas sekarang dengan mengetik:
- source ~/.bashrc
Jika Anda perlu mengatur variabel seluruh sistem, Anda mungkin ingin mempertimbangkan untuk menambahkan mereka ke /etc/profile
, /etc/bash.bashrc
, atau /etc/environment
.
Variabel lingkungan dan shell selalu ada di dalam sesi shell dan dapat menjadi sangat berguna. Mereka adalah cara yang menarik bagi proses induk untuk mengatur detail konfigurasi bagi anak-anaknya, dan merupakan cara mengatur opsi di luar berkas.
Ini memiliki banyak keuntungan dalam situasi tertentu. Misalnya, beberapa mekanisme penyebaran bergantung pada variabel lingkungan untuk mengonfigurasi informasi autentikasi. Ini berguna karena mekanismenya tidak perlu menyimpannya di dalam berkas yang mungkin dapat terlihat oleh pihak luar.
Ada banyak skenario lain yang lebih biasa dan umum, saat Anda perlu membaca atau mengubah lingkungan sistem Anda. Alat dan teknik ini seharusnya memberi Anda fondasi yang baik untuk membuat perubahan ini dan menggunakannya dengan benar.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!