Perintah printenv Linux: nilai variabel, ekspor, dan status keluar

printenv adalah perintah GNU Coreutils yang mencetak nilai-nilai variabel di lingkungan proses saat ini. Jika Anda menentukan nama variabel, Anda hanya dapat memeriksa nilai yang dibutuhkan, dan jika Anda mengabaikan nama tersebut, perintah ini akan mencetak semua variabel lingkungan.

Tidak seperti env, yang mengubah lingkungan untuk menjalankan perintah, printenv fokus pada inspeksi. Ini berguna untuk memeriksa perbedaan antara variabel shell dan variabel lingkungan atau memastikan apakah sebuah variabel telah diteruskan dalam sebuah skrip.

Apa itu perintah printenv?

Sebuah program menerima satu set variabel lingkungan dari proses induknya. printenv mengirimkan baik seluruh set atau nilai dari nama tertentu dari lingkungan yang diberikan ke output standar.

Variabel yang hanya ada di dalam shell dan belum di-export-kan tidak termasuk dalam lingkungan, sehingga tidak akan terlihat dengan printenv.

Sintaks Dasar

printenv [opsi] [variabel ...]

Saat dijalankan tanpa nama variabel, ini mencetak semua variabel lingkungan dalam format name=value.

printenv
printenv | sort

Seluruh lingkungan dapat mencakup token otentikasi atau informasi akses layanan. Sebelum membagikan hasil atau menyimpannya ke log, pastikan tidak ada item sensitif.

Memeriksa variabel lingkungan tertentu

printenv HOME
printenv PATH
printenv LANG

Jika Anda menentukan nama variabel, hanya nilainya yang dicetak, dan awalan name= tidak ditambahkan. Anda juga dapat menentukan beberapa nama sekaligus.

printenv HOME SHELL USER

Nilai dicetak menurut urutan nama yang diberikan, tetapi nama yang tidak ada dilewati. Sebagian nilai masih dapat dicetak meskipun status akhirnya 1. Jangan menganggap baris kosong atau nomor baris selalu menunjukkan variabel tertentu.

Memeriksa apakah sebuah variabel ada berdasarkan status keluar

GNU printenv mengembalikan 0 jika semua variabel yang ditentukan ditemukan, 1 jika ada yang tidak dapat ditemukan, dan 2 jika terjadi kesalahan penulisan.

if printenv APP_ENV >/dev/null; then
  printf '%s\n' 'APP_ENV ada dalam lingkungan'
else
  status=$?
  if [ "$status" -eq 1 ]; then
    printf '%s\n' 'APP_ENV tidak ada dalam lingkungan'
  else
    printf 'Pemeriksaan gagal: status=%s\n' "$status" >&2
  fi
fi

Variabel lingkungan dengan nilai string kosong juga merupakan "variabel yang ada." Untuk membedakan antara nilai kosong dan ketiadaan variabel, Anda perlu memeriksa status keluar dan keluaran secara bersamaan.

Kasus di mana ada variabel shell tetapi tidak muncul di printenv

Jalankan contoh berikut di Bash. Subshell menjaga pengaturan terminal Anda, sedangkan unset memastikan atribut ekspor lama tidak memengaruhi hasil.

(
unset APP_MODE
APP_MODE=development
printf '%s\n' "$APP_MODE"
printenv APP_MODE
)

Penugasan pertama membuat variabel shell Bash, tetapi tidak diekspor ke lingkungan proses anak. printenv adalah program eksternal, jadi tidak dapat menerima nilai tersebut.

(
unset APP_MODE
APP_MODE=development
export APP_MODE
printenv APP_MODE
)

Contoh pertama menampilkan development lewat printf, tetapi printenv tidak mencetak nilai dan mengembalikan 1. Contoh kedua menampilkan development lewat printenv setelah ekspor. Kedua percobaan selesai tanpa mengubah variabel shell induk.

Melihat entri PATH baris demi baris

PATH adalah daftar direktori yang dipisahkan dengan tanda titik dua, jadi Anda bisa membaginya seperti ini agar lebih mudah dibaca.

printenv PATH | tr ':' '\n'

Entri kosong pada PATH Linux dapat mewakili direktori saat ini; periksa nilai asli untuk titik dua awal, akhir, atau berurutan. Pipeline ini untuk tampilan: status akhirnya biasanya berasal dari tr, sehingga keberhasilannya tidak membuktikan kueri printenv berhasil.

Menggunakan -0 untuk memisahkan dengan karakter NUL

printenv -0
printenv --null

-0 atau --null mengeluarkan karakter NUL di akhir setiap item alih-alih newline. Karena nilai variabel lingkungan itu sendiri dapat mengandung newline, ini berguna ketika program lain perlu menangani hasilnya secara jelas.

printenv -0 | while IFS= read -r -d '' item; do
  printf '%q\n' "$item"
done

NUL adalah byte nol, bukan dua karakter \0. Dalam Bash, pembatas kosong pada read -d '' membaca hingga NUL. Tanpa nama, setiap item berupa nama=nilai; dengan nama tertentu, hanya nilainya yang dicetak. printf %q mengutip karakter khusus untuk dibaca manusia, tetapi tidak menyamarkan rahasia. Pipeline ini dapat menampilkan seluruh lingkungan, jadi gunakan hanya pada lingkungan uji yang aman.

Opsi yang didukung

Opsi Deskripsi
-0, --null Akhiri setiap item output dengan karakter NUL alih-alih newline.
--help Mencetak penggunaan dan keluar.
--version Mencetak versi program dan keluar.

-0 adalah fitur dari GNU Coreutils. Dukungan dapat bervariasi pada sistem mirip Unix lainnya.

Perbandingan printenv, env, dan printf

Perintah Item yang Diperiksa Fitur
printenv NAME Variabel lingkungan yang diteruskan ke proses anak Berguna untuk memeriksa keberadaan variabel lingkungan tertentu dalam status keluar.
env Seluruh lingkungan saat ini Fitur inti adalah mengubah lingkungan untuk mengeksekusi perintah lain.
printf '%s\n' "$NAME" Nilai saat ini dari variabel yang diperluas oleh shell Anda juga dapat menampilkan variabel shell yang belum diekspor ke lingkungan.

Anda juga dapat melihat nilainya dengan echo "$NAME", tetapi dalam skrip, printf lebih dapat diprediksi untuk menghindari perbedaan dalam implementasi seperti nilai yang terlihat seperti opsi atau penanganan backslash.

Memeriksa lingkungan yang diatur sementara

Saat digunakan dengan env, Anda dapat memeriksa nilai yang akan diteruskan ke perintah tertentu.

env APP_ENV=staging printenv APP_ENV
env -u HTTP_PROXY printenv HTTP_PROXY

Perintah kedua tidak menghasilkan apa pun dan mengembalikan status kegagalan karena variabel telah dihapus.

Mengapa nilai berbeda untuk setiap proses

Lingkungan bukanlah satu tabel tunggal untuk seluruh sistem tetapi data yang dimiliki setiap proses. Terminal baru, sesi SSH, layanan systemd, pekerjaan cron, dan kontainer menggunakan proses induk dan pengaturan startup yang berbeda, sehingga nama variabel yang sama mungkin memiliki nilai yang berbeda atau mungkin tidak ada.

Saat mendiagnosis masalah, Anda harus menjalankan printenv dalam lingkungan pengguna, layanan, dan kontainer yang sama dengan program yang sebenarnya berjalan. Jangan berasumsi bahwa nilai yang terlihat di terminal secara otomatis diteruskan ke layanan.

Langkah-langkah keamanan saat menampilkan variabel lingkungan

  • Jangan menempelkan hasil lengkap printenv di isu publik atau obrolan.
  • Periksa apakah token dan kata sandi disamarkan di log CI.
  • Hanya sebutkan nama variabel yang perlu Anda periksa agar jumlah nilai yang diperiksa minimal.
  • Saat memeriksa apakah nilai rahasia diperlukan, jangan cetak nilainya; gunakan status keluar sebagai gantinya.
  • Variabel lingkungan dapat terekspos ke alat debugging atau proses anak dengan izin yang sama, jadi mereka tidak boleh dianggap sebagai penyimpanan rahasia itu sendiri.

Masalah umum

Nilai mungkin tidak muncul meskipun sudah diset.

Kemungkinan Anda hanya membuat variabel shell tanpa export. Jalankan export NAME dan kemudian periksa di proses anak baru.

Sebuah baris kosong dicetak, apakah itu berarti variabel tidak ada?

Bisa sulit untuk dibedakan hanya dengan melihat layar apakah sebuah variabel diatur sebagai string kosong atau tidak ada. Periksa status keluar dari perintah tersebut.

env EMPTY_VALUE= printenv EMPTY_VALUE
printf 'status=%s\n' "$?"
env -u EMPTY_VALUE printenv EMPTY_VALUE
printf 'status=%s\n' "$?"

Kasus pertama mencetak baris kosong dan status=0. Kasus kedua tidak mencetak nilai dan menampilkan status=1. Setiap printf membaca status perintah sebelumnya lalu mengembalikan statusnya sendiri.

Variabel lingkungan menghilang setelah sudo.

sudo menghapus atau membatasi variabel lingkungan sesuai kebijakan keamanan. Alih-alih melewati untuk selalu mempertahankannya, tinjau kebijakan sudoers dan hanya gunakan variabel yang diperlukan untuk perintah target.

Pertanyaan yang Sering Diajukan

Apakah printenv menunjukkan semua variabel shell saat ini?

Tidak. Perintah ini hanya menampilkan lingkungan yang diteruskan kepadanya. Variabel yang tidak diekspor dan array Bash perlu diperiksa dengan perintah bawaan seperti declare. Variabel lokal fungsi yang juga diekspor tetap dapat diterima program anak selama berada dalam cakupannya.

Bisakah saya mencetak nama dan nilai dari variabel tertentu sekaligus?

printenv NAME hanya mencetak nilainya. Bentuk printf 'NAME=%s\n' "$(printenv NAME)" dapat dipakai untuk tampilan sederhana, tetapi substitusi perintah menghapus semua newline di akhir nilai. Status akhir juga berasal dari printf, sehingga tidak membuktikan bahwa variabel ditemukan; periksa status kueri secara terpisah jika dibutuhkan.

Bisakah Anda mengubah variabel lingkungan dengan printenv?

Tidak. printenv adalah perintah kueri. Di shell saat ini, gunakan penugasan dan export, dan untuk diterapkan hanya pada satu perintah, gunakan env NAME=VALUE command.

Artikel terkait dan dokumentasi resmi