// Tutorial //

Cara Membaca dan Mengatur Variabel Lingkungan dan Shell pada Linux

Published on December 1, 2020
Bahasa Indonesia
Cara Membaca dan Mengatur Variabel Lingkungan dan Shell pada Linux

Pengantar

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.

Cara Variabel Lingkungan dan Lingkungan Bekerja

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.

Mencetak Variabel Shell dan Lingkungan

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:

  1. printenv
Output
SHELL=/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:

  1. 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:

  1. 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:

  1. set
Output
BASH=/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:

  1. 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:

  1. (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:

  1. 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.

Variabel Lingkungan dan Shell Umum

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.

Mengatur Variabel Shell dan Lingkungan

Untuk lebih memahami perbedaan antara variabel shell dan lingkungan, serta untuk memperkenalkan sintaks untuk pengaturan variabel ini, kita akan melakukan demonstrasi kecil.

Menciptakan Variabel Shell

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.

  1. 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:

  1. set | grep TEST_VAR
Output
TEST_VAR='Hello World!'

Kita dapat memverifikasi bahwa ini bukan variabel lingkungan dengan mencoba hal yang sama menggunakan printenv:

  1. 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.

  1. echo $TEST_VAR
Output
Hello 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:

  1. bash
  2. 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:

  1. exit

Menciptakan Variabel Lingkungan

Sekarang, mari kita ubah variabel shell menjadi variabel lingkungan. Kita dapat melakukannya dengan mengekspor variabel. Perintah untuk melakukannya dinamakan:

  1. export TEST_VAR

Ini akan mengubah variabel kita menjadi variabel lingkungan. Kita dapat memeriksanya dengan memeriksa daftar lingkungan kita lagi:

  1. printenv | grep TEST_VAR
Output
TEST_VAR=Hello World!

Kali ini, variabel kita muncul. Mari kita coba eksperimen kita dengan shell anak lagi:

  1. bash
  2. echo $TEST_VAR
Output
Hello 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:

  1. export NEW_VAR="Testing export"

Uji bahwa ini telah diekspor sebagai variabel lingkungan:

  1. printenv | grep NEW_VAR
Output
NEW_VAR=Testing export

Sekarang, mari kita keluar dan kembali ke shell asli kita:

  1. exit

Mari kita lihat apakah variabel baru tersedia:

  1. 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.

Melakukan Demosi dan Menghapus Pengaturan Variabel

Kita masih memiliki variabel TEST_VAR yang didefinisikan sebagai variabel lingkungan. Kita dapat mengubahnya kembali ke variabel shell dengan mengetik:

  1. export -n TEST_VAR

Ini bukan lagi variabel lingkungan:

  1. printenv | grep TEST_VAR

Namun, ini masih merupakan variabel shell:

  1. set | grep TEST_VAR
Output
TEST_VAR='Hello World!'

Jika kita ingin sepenuhnya menghapus pengaturan variabel, baik shell atau lingkungan, kita dapat melakukannya dengan perintah unset:

  1. unset TEST_VAR

Kita dapat memverifikasi bahwa ini tidak lagi diatur:

  1. echo $TEST_VAR

Tidak ada yang dihasilkan karena variabel telah dihapus pengaturannya.

Mengatur Variabel Lingkungan saat Log Masuk

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.

Perbedaan Sesi Shell Log Masuk, Non-Log Masuk, Interaktif, dan Non-Interaktif

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.

Mengimplementasikan Variabel Lingkungan

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:

  1. 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:

  1. 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:

  1. 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.

Kesimpulan

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.

Learn more about us


About the authors

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


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!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

card icon
Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Sign up
card icon
Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We’d like to help.

Learn more
card icon
Become a contributor

You get paid; we donate to tech nonprofits.

Learn more
Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow – whether you’re running one virtual machine or ten thousand.

Learn more ->
DigitalOcean Cloud Control Panel