One place for hosting & domains

      Shell

      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:

      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:

      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:

      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:

      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:

      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.

      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.

      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:

      Output

      TEST_VAR='Hello World!'

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

      Seharusnya tidak ada keluaran yang dihasilkan.

      Mari kita anggap ini sebagai kesempatan untuk menunjukkan cara mengakses nilai dari variabel shell atau lingkungan apa pun.

      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:

      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:

      Menciptakan Variabel Lingkungan

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

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

      Output

      TEST_VAR=Hello World!

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

      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:

      • export NEW_VAR="Testing export"

      Uji bahwa ini telah diekspor sebagai variabel lingkungan:

      Output

      NEW_VAR=Testing export

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

      Mari kita lihat apakah variabel baru tersedia:

      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:

      Ini bukan lagi variabel lingkungan:

      Namun, ini masih merupakan variabel shell:

      Output

      TEST_VAR='Hello World!'

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

      Kita dapat memverifikasi bahwa ini tidak lagi diatur:

      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:

      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:

      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:

      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.



      Source link

      Cómo leer y configurar variables de entorno y de shell en Linux


      Introducción

      Cuando interactúa con su servidor a través una sesión de shell, hay muchos elementos de información que el shell compila para determinar su comportamiento y acceso a los recursos. Algunas de estas opciones se incluyen en las opciones de configuración, y otras las determina la entrada del usuario.

      Una forma en que el shell realiza un seguimiento de todas estas configuraciones y detalles es en un área que se denomina entorno. El entorno es un área que el shell crea cada vez que inicia una sesión que contiene variables que definen las propiedades del sistema.

      En esta guía, analizaremos cómo interactuar con el entorno y leer o configurar variables de entorno y de shell de forma interactiva y mediante archivos de configuración.

      Cómo funcionan el entorno y las variables de entorno

      Cada vez que se genera una sesión de shell, se lleva a cabo un proceso para recopilar y compilar información que debería estar disponible para el proceso de shell y sus procesos secundarios. Los datos para estas configuraciones se obtienen de diversos archivos y configuraciones en el sistema.

      El entorno proporciona un medio a través del que el proceso de shell puede obtener o establecer configuraciones y, a la vez, transmitirlas a sus procesos secundarios.

      El entorno se implementa como cadenas que representan pares clave-valor. Si se transmiten múltiples valores, estos suelen separarse mediante símbolos de dos puntos (:). Normalmente, cada par tendrá un aspecto similar a este:

      KEY=value1:value2:...
      

      Si el valor contiene un espacio en blanco significativo, se utilizan comillas:

      KEY="value with spaces"
      

      Las claves en estos casos son variables. Pueden ser de dos tipos: variables de entorno o variables de shell.

      Las variables de entorno son variables definidas para el shell actual y heredadas por cualquier shell o proceso secundario. Las variables de entorno se utilizan para transmitir información a procesos que se producen desde el shell.

      Las variables de shell son variables que se encuentran exclusivamente dentro del shell en que se configuraron o definieron. A menudo, se utilizan para realizar un seguimiento de datos efímeros, como el directorio actual de trabajo.

      Por costumbre, estos tipos de variables suelen definirse utilizando letras en mayúsculas. Esto ayuda a los usuarios a distinguir las variables de entorno en otros contextos.

      Impresión de variables de entorno y de shell

      Cada sesión de shell hace un seguimiento de sus propias variables de entorno y de shell. Podemos acceder a ellas de diferentes formas.

      Podemos ver una lista de todas nuestras variables de entorno usando los comandos env o printenv. En su estado predeterminado, deben funcionar exactamente igual:

      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

      Esto es bastante típico del resultado de printenv y env. La diferencia entre los dos comandos es visible solamente en su funcionalidad más específica. Por ejemplo, con printenv, puede solicitar los valores de variables individuales:

      Output

      /bin/bash

      Por otro lado, env le permite modificar el entorno en que se ejecutan los programas transmitiendo un conjunto de definiciones de variables a un comando como el siguiente:

      • env VAR1="value" command_to_run command_options

      Dado que, como vimos anteriormente, los procesos secundarios suelen heredar las variables de entorno del proceso principal, esto le da la oportunidad de anular valores o agregar otras variables al proceso secundario.

      Como se puede ver en el resultado de nuestro comando printenv, hay algunas variables de entorno configuradas en los archivos y procesos de nuestro sistema sin nuestra intervención.

      Se muestran las variables de entorno, pero ¿cómo vemos las variables de shell?

      El comando set se puede utilizar para esto. Si escribimos set sin ningún otro parámetro, obtendremos una lista de todas las variables de shell, variables de entorno, variables locales y funciones de shell:

      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=() . . .

      Por lo general, es una lista enorme. Es recomendable canalizarla a un programa de buscapersonas para manejar con mayor facilidad la cantidad de resultados:

      La cantidad de información adicional que recibiremos será un poco abrumadora. Probablemente, no necesitemos saber todas las funciones de bash que se definen, por ejemplo.

      Podemos filtrar el resultado especificando que set debe funcionar en el modo POSIX, lo que no imprimirá las funciones del shell. Podemos ejecutarlo en un subshell para que no cambie nuestro entorno actual:

      Esto enumerará todas las variables de entorno y de shell que están definidas.

      Podemos intentar comparar este resultado con el resultado de los comandos env o printenv para intentar obtener una lista que incluya únicamente variables de shell, pero el resultado no será preciso por las diferentes formas en que estos comandos generan información:

      • comm -23 <(set -o posix; set | sort) <(env | sort)

      Esto probablemente seguirá incluyendo algunas variables de entorno, debido a que el comando set genera valores entre comillas, mientras que los comandos printenv y env no generan los valores de las cadenas entre comillas.

      Aún así, le dará una buena idea de las variables de entorno y de shell que se configuran en su sesión.

      Estas variables se utilizan para toda clase de cosas. Proporcionan una forma alternativa de establecer valores persistentes para la sesión entre procesos, sin realizar cambios en un archivo.

      Variables frecuentes de entorno y de shell

      Algunas variables de entorno y de shell son muy útiles y se utilizan con bastante frecuencia. Aquí hay algunas variables frecuentes de entorno con las que se encontrará:

      • SHELL: Describe el shell que interpretará cualquier comando que ingrese. En la mayoría de los casos, será bash de forma predeterminada, pero se pueden establecer otros valores si prefiere otras opciones.
      • TERM: Especifica el tipo de terminal a emular cuando se ejecuta el shell. Se pueden emular diferentes terminales de hardware para diferentes requisitos de funcionamiento. Sin embargo, generalmente no tendrá que preocuparse por esto.
      • USER: El usuario que inició sesión actualmente.
      • PWD: El directorio actual de trabajo.
      • OLDPWD: El directorio anterior de trabajo. Esto se mantiene en el shell para volver a su directorio anterior ejecutando cd -.
      • LS_COLORS: Define los códigos de color que se utilizan para añadir de forma opcional un resultado de color al comando ls. Esto se utiliza para distinguir diferentes tipos de archivos y proporcionar más información al usuario de forma rápida.
      • MAIL: La ruta al buzón del usuario actual.
      • PATH: Una lista de directorios que el sistema comprobará cuando busque comandos. Cuando un usuario escriba un comando, el sistema comprobará los directorios en este orden para el ejecutable.
      • LANG: Las configuraciones actuales de idioma y localización, incluida la codificación de caracteres.
      • HOME: El directorio principal del usuario actual.
      • _: El comando más reciente ejecutado anteriormente.

      Además de estas variables de entorno, algunas variables de shell que aparecerán a menudo son:

      • BASHOPTS: La lista de opciones que se utilizaron cuando se ejecutó bash. Esto puede ser útil para averiguar si el entorno de shell funcionará de la forma que usted desea.
      • BASH_VERSION: La versión de bash que se está ejecutando, en un formato que los usuarios puedan leer.
      • BASH_VERSINFO: La versión de bash, en un resultado que un equipo pueda leer.
      • COLUMNS: El número de ancho de columnas que se utilizan para generar el resultado en la pantalla.
      • DIRSTACK: La pila de directorios que están disponibles con los comandos pushd y popd.
      • HISTFILESIZE: La cantidad de líneas del historial de comandos que se almancenan en un archivo.
      • HISTSIZE: La cantidad de líneas del historial de comandos que se permiten en la memoria.
      • HOSTNAME: El nombre de host de la computadora en este momento.
      • IFS: El separador de campo interno para separar las entradas en la línea de comandos. De forma predeterminada, es un espacio.
      • PS1: La definición de la entrada del comando principal. Esto se utiliza para definir cómo se ve la entrada de la línea de comandos cuando se inicia una sesión de shell. PS2 se utiliza para declarar las entradas de la línea de comandos secundarias para cuando un comando se extiende a varias líneas.
      • SHELLOPTS: Opciones de shell que se pueden configurar con la opción set.
      • UID: El UID del usuario actual.

      Configuración de variables de entorno y de shell

      Para entender mejor la diferencia entre las variables de entorno y de shell, y para introducir la sintaxis para configurar estas variables, haremos una pequeña demostración.

      Creación de variables de shell

      Empezaremos definiendo una variable de shell en nuestra sesión actual. Esto es fácil de lograr; solo necesitamos especificar un nombre y un valor. Seguiremos la norma de mantener el nombre de la variable en mayúsculas y lo configuraremos en una cadena simple.

      Aquí utilizamos comillas, ya que el valor de nuestra variable contiene un espacio. Además, usamos comillas simples porque el signo de exclamación es un carácter especial en el shell de bash que generalmente se expande al historial de bash si no se escapa o se introduce en comillas simples.

      Ahora, tenemos una variable de shell. Esta variable está disponible en nuestra sesión actual, pero no se transmitirá a los procesos secundarios.

      Podemos ver esto realizando una búsqueda de nuestra nueva variable en el resultado de set:

      Output

      TEST_VAR='Hello World!'

      Podemos verificar que esta no es una variable de entorno intentando lo mismo con printenv:

      No debería aparecer ningún resultado.

      Aprovecharemos esto como una oportunidad para demostrar una forma de acceder al valor de cualquier variable de entorno o de shell.

      Output

      Hello World!

      Como se puede ver, se hace referencia al valor de una variable al precederla con un signo $. El shell interpreta que esto significa que debe sustituir el valor de la variable cuando se encuentre con casos como este.

      Ahora tenemos una variable de shell. No debería transmitirse a ningún proceso secundario. Podemos generar un nuevo shell de bash desde el actual para demostrar:

      Si escribimos bash para generar un shell secundario y, luego, intentamos acceder al contenido de la variable, no se obtendrá ningún resultado. Eso es lo que esperábamos.

      Vuelva a nuestro shell original escribiendo exit:

      Creación de variables de entorno

      Ahora, vamos a convertir nuestra variable de shell en una variable de entorno. Podemos hacer esto exportando la variable. El comando para hacerlo se denomina correctamente:

      Esto convertirá nuestra variable en una variable de entorno. Podemos verificar que el cambio se realizó revisando nuevamente nuestra lista de variables de entorno:

      Output

      TEST_VAR=Hello World!

      Esta vez, aparecerá nuestra variable. Intentemos nuestro experimento de nuevo con nuestro shell secundario:

      Output

      Hello World!

      ¡Genial! Nuestro shell secundario recibió la variable establecida por el shell principal. Antes de salir de este shell secundario, intentemos exportar otra variable. Podemos configurar variables de entorno en un solo paso de esta manera:

      • export NEW_VAR="Testing export"

      Esta es una prueba de que se exportó como variable de entorno:

      Output

      NEW_VAR=Testing export

      Ahora, regresemos a nuestro shell original:

      Veamos si nuestra nueva variable está disponible:

      No se muestra ningún resultado.

      Esto se debe a que las variables de entorno solo se transmiten a procesos secundarios. No hay una forma incorporada de configurar variables de entorno del shell principal. Eso es bueno en la mayoría de casos y evita que los programas afecten al entorno de funcionamiento desde el que fueron invocados.

      La variable NEW_VAR se configuró como una variable de entorno en nuestro shell secundario. Esta variable estaría disponible para sí misma y para cualquiera de sus shells y procesos secundarios. Cuando regresemos a nuestro shell principal, el entorno se eliminará.

      Degradación y anulación de variables

      Todavía tenemos nuestra variable TEST_VAR definida como una variable de entorno. Podemos volver a convertirla en una variable de shell escribiendo:

      Ya no es una variable de entorno:

      Sin embargo, aún es una variable de shell:

      Output

      TEST_VAR='Hello World!'

      Si queremos anular por completo una variable, de shell o de entorno, podemos hacerlo con el comando unset:

      Podemos verificar que ya no está configurada:

      No se genera ningún resultado porque la variable se anuló.

      Configuración de variables de entorno al iniciar sesión

      Ya mencionamos que muchos programas utilizan variables de entorno para decidir los detalles de cómo operar. No queremos tener que configurar variables importantes cada vez que iniciemos una nueva sesión de shell, y ya vimos cuántas variables ya están configuradas al iniciar sesión, entonces ¿cómo creamos y definimos las variables automáticamente?

      En realidad, este es un problema más complejo de lo que parece inicialmente debido a los numerosos archivos de configuración que el shell de bash lee dependiendo de cómo se inicie.

      Diferencia entre las sesiones de shell interactivas, no interactivas, con inicio de sesión y sin inicio de sesión

      El shell de bash lee diferentes archivos de configuración dependiendo de cómo se inicia la sesión.

      Una distinción entre las diferentes sesiones es si el shell se genera como una sesión con inicio de sesión o sin inicio de sesión.

      Un shell con inicio de sesión es una sesión de shell que comienza cuando se autentica al usuario. Si inicia sesión en una sesión de terminal o mediante SSH y realiza una autenticación, la sesión de shell se configurará como un shell con inicio de sesión.

      Si inicia una nueva sesión de shell desde la sesión autenticada, como hicimos invocando al comando bash desde el terminal, se inicia una sesión de shell sin inicio de sesión. No se solicitaron sus detalles de autenticación cuando inició su shell secundario.

      Otra distinción que se puede hacer es si una sesión de shell es interactiva o no interactiva.

      Una sesión de shell interactiva es una sesión de shell que se conecta a un terminal. Una sesión de shell no interactiva es una que no se conecta a una sesión de terminal.

      Cada sesión de shell se clasifica como una sesión con inicio de sesión o sin inicio de sesión y como interactiva o no interactiva.

      Una sesión normal que comienza con SSH suele ser un shell con inicio de sesión interactivo. Normalmente, una secuencia de comandos ejecutada desde la línea de comandos se ejecuta en un shell no interactivo y sin inicio de sesión. Una sesión de terminal puede ser cualquier combinación de estas dos propiedades.

      Si una sesión de shell se clasifica como un shell con inicio de sesión o un shell sin inicio de sesión, tiene repercusiones sobre qué archivos se leen para iniciar la sesión de shell.

      Una sesión iniciada como sesión con inicio de sesión leerá primero los detalles de la configuración del archivo /etc/profile. Luego, buscará el primer archivo de configuración de shell con inicio de sesión en el directorio principal del usuario para obtener detalles de configuración específicos del usuario.

      Lee el primer archivo que puede encontrar con ~/.bash_profile, ~/.bash_login y ~/.profile, y no lee ningún otro archivo.

      Por el contrario, una sesión definida como shell sin inicio de sesión leerá /etc/bash.bashrc y, luego, el archivo ~/.bashrc específico del usuario para crear su entorno.

      Los shells no interactivos leen la variable de entorno llamada BASH_ENV y leen el archivo especificado para definir el nuevo entorno.

      Implementación de variables de entorno

      Como se puede ver, hay diversos archivos que generalmente necesitaríamos revisar para realizar nuestra configuración.

      Eso ofrece gran flexibilidad que puede ser útil en situaciones específicas en que queremos ciertas configuraciones en un shell con inicio de sesión y otras configuraciones en un shell sin inicio de sesión. Sin embargo, la mayoría de las veces preferiremos las mismas configuraciones en ambas situaciones.

      Por suerte, la mayoría de las distribuciones de Linux configura los archivos de configuración con inicio de sesión para obtener los archivos de configuración sin inicio de sesión. Eso significa que puede definir variables de entorno que quiera que sean de ambos tipos de sesión dentro de los archivos de configuración sin inicio de sesión. Luego, se leerán en ambos casos.

      Por lo general, configuraremos variables de entorno específicas de usuario y, normalmente, preferiremos que nuestras configuraciones estén disponibles en shells con inicio de sesión y sin inicio de sesión. Eso significa que el lugar para definir estas variables está en el archivo ~/.bashrc.

      Abra este archivo ahora:

      Lo más probable es que ya contenga bastantes datos. Muchas de las definiciones aquí son para configurar opciones de bash, que no están relacionadas con variables de entorno. Puede configurar variables de entorno de la misma manera en que lo haría en la línea de comandos:

      Cualquier nueva variable de entorno se puede añadir en cualquier lugar del archivo ~/.bashrc, siempre que no se coloque en el medio de otro comando o para crear un bucle. Luego, podemos guardar y cerrar el archivo. La próxima vez que inicie una sesión de shell, su declaración de variable de entorno se leerá y pasará al entorno de shell. Puede forzar su sesión actual a leer el archivo escribiendo lo siguiente:

      Si necesita configurar variables para todo el sistema, es recomendable añadirlas a /etc/profile, /etc/bash.bashrc o /etc/environment.

      Conclusión

      Las variables de entorno y de shell siempre están presentes en las sesiones de shell y pueden ser muy útiles. Son una forma interesante para que un proceso principal establezca los detalles de la configuración para sus procesos secundarios y son una forma de configurar opciones fuera de los archivos.

      Eso tiene muchas ventajas en situaciones específicas. Por ejemplo, algunos mecanismos de implementación utilizan las variables de entorno para configurar la información de autenticación. Eso es útil porque no requiere guardarlos en archivos que terceros puedan ver.

      Hay muchos otros casos más triviales, pero también más frecuentes, en que deberá leer o alterar el entorno de su sistema. Estas herramientas y técnicas le darán una buena base para realizar estos cambios y usarlos correctamente.



      Source link

      Comment lire et configurer les variables d’environnement et de shell sous Linux


      Introduction

      Au cours d’une interaction avec votre serveur via une session shell, shell compile de nombreuses informations pour déterminer son comportement et accéder aux ressources. Certains de ces réglages se font dans les paramètres de configuration, d’autres doivent être saisis par l’utilisateur.

      Le shell assure notamment le suivi de tous ces paramètres et ces détails par le biais d’une zone qu’il gère, appelée environnement. L’environnement est une zone que le shell construit à chaque fois qu’il démarre une session qui contient des variables définissant les propriétés du système.

      Dans ce guide, nous allons voir de quelle manière interagir avec l’environnement, lire ou configurer les variables d’environnement et de shell de manière interactive et via les fichiers de configuration.

      Chaque fois qu’une session shell est lancée, un processus est mis en place pour collecter et rassembler les informations qui devraient être à la disposition du processus shell et de ses processus enfant. Il obtient les données de ces paramètres à partir d’un grand nombre de fichiers et paramètres différents qui se trouvent sur le système.

      L’environnement fournit un moyen par lequel le processus shell peut obtenir ou configurer les paramètres et, à son tour, les transmettre à ses processus enfant.

      L’environnement est implémenté en tant que chaînes qui représentent des paires de valeurs clé. Si la transmission comporte plusieurs valeurs, elles sont généralement séparées par un :. Chaque paire ressemblera généralement à ceci :

      KEY=value1:value2:...
      

      Si la valeur contient un white-space significatif, des guillemets sont utilisés :

      KEY="value with spaces"
      

      Dans ces scénarios, les clés sont des variables. Elles peuvent être de deux types différents : les variables d’environnement ou les variables de shell.

      Les variables d’environnement sont des variables qui sont définies pour le shell en cours d’utilisation et héritées par tous les shells ou processus enfant. Les variables d’environnement servent à transmettre des informations dans les processus qui se déclenchent depuis le shell.

      Les variables de shell sont des variables qui sont exclusivement contenues dans le shell dans lequel elles ont été configurées ou définies. Elles sont couramment utilisées pour garder un suivi des données éphémères, comme le répertoire actuellement utilisé.

      Par convention, ces types de variables sont généralement définis par des majuscules. Cela aide les utilisateurs à distinguer les variables d’environnement dans d’autres contextes.

      Impression des variables de shell et d’environnement

      Chaque session de shell garde une trace de ses propres variables de shell et d’environnement. Nous pouvons y accéder de différentes façons.

      Nous pouvons voir une liste de toutes nos variables d’environnement en utilisant les commandes env ou printenv. Dans leur état par défaut, elles devraient fonctionner exactement de la même manière :

      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

      Ceci est assez typique pour la sortie à la fois de printenv et env. La différence entre les deux commandes ne se voit que dans leur fonctionnalité plus spécifique. Par exemple, avec printenv, vous pouvez demander les valeurs de variables individuelles :

      Output

      /bin/bash

      En revanche, env vous permet de modifier l'environnement dans lequel les programmes s'exécutent en transmettant un ensemble de définitions de variables par le biais d'une commande, de la manière suivante :

      • env VAR1="value" command_to_run command_options

      Étant donné que, comme nous l'avons appris précédemment, les processus enfant héritent généralement des variables d'environnement du processus parent, vous pouvez remplacer les valeurs ou ajouter des variables supplémentaires à l'enfant.

      Comme vous pouvez le constater à partir du résultat de notre commande printenv, de nombreuses variables d'environnement sont configurées par les fichiers et les processus de notre système sans rien à saisir.

      Ces dernières montrent les variables d'environnement, mais comment consulter les variables de shell ?

      Pour cela, vous pouvez utiliser la commande set. Si nous saisissons set sans aucun autre paramètre, nous obtiendrons une liste de toutes les variables de shell, variables d'environnement, variables locales et fonctions de shell :

      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=() . . .

      On se retrouve généralement avec une énorme liste. Il est vivement conseillé de les intégrer dans un programme de pagination afin de pouvoir traiter la quantité de résultats obtenus plus facilement :

      La quantité d'informations supplémentaires que nous recevons est quelque peu déroutante. Nous n'avons probablement pas à connaître toutes les fonctions de bash configurées, par exemple.

      Nous pouvons nettoyer le résultat en spécifiant que set devrait s'exécuter en mode POSIX, ce qui n'imprimera pas les fonctions de shell. Nous pouvons l'exécuter dans un sous-shell pour qu'il ne change pas notre environnement actuel :

      Vous obtiendrez ainsi une liste de toutes les variables d'environnement et de shell configurées.

      Nous pouvons tenter de comparer ce résultat avec celui obtenu avec les commandes env ou printenv afin d'obtenir une liste des variables de shell uniquement, mais cela risque d'être imparfait en raison des différentes façons dont ces commandes renverront les informations :

      • comm -23 <(set -o posix; set | sort) <(env | sort)

      Il est probable que la liste contienne encore quelques variables d'environnement, car la commande set déclenche les valeurs citées, tandis que les commandes printenv et env ne citent pas les valeurs des chaînes de caractères.

      Cela devrait vous donner une bonne idée des variables d'environnement et de shell qui se trouvent dans votre session.

      Ces variables sont utilisées pour toute sorte de choses. Elles vous offrent une alternative pour configurer des valeurs persistantes pour la session entre les processus, sans avoir à écrire les modifications sur un fichier.

      Variables d'environnement et de shell communes

      Certaines variables d'environnement et de shell sont très utiles et souvent référencées. Voici quelques variables d'environnement communes que vous allez rencontrer :

      • SHELL : cette variable décrit le shell qui interprétera les commandes que vous saisissez. Dans la plupart des cas, il s'agira de bash par défaut, mais d'autres valeurs peuvent être configurées si vous préférez utiliser d'autres options.
      • TERM : cette variable spécifie le type de terminal à émuler à l'exécution du shell. Il est possible d'émuler différents terminaux de matériel pour différentes exigences d'exploitation. Cependant, de manière générale, vous n'aurez pas à vous soucier de cela.
      • USER : l'utilisateur actuellement connecté.
      • PWD : le répertoire de travail en cours d'exécution.
      • OLDPWD : le précédent répertoire utilisé. Il est conservé par le shell afin de pouvoir revenir au précédent répertoire en exécutant cd-.
      • LS_COLORS : cette variable définit les codes de couleurs qui vous servent à ajouter une couleur aux résultats obtenus avec la commande ls. Elle vous permet de distinguer les différents types de fichiers et donne de plus amples informations à l'utilisateur en un coup d'œil.
      • MAIL : le chemin vers la boîte de réception de l'utilisateur en cours.
      • PATH : une liste des répertoires que le système vérifiera lorsque vous recherchez des commandes. Lorsqu'un utilisateur saisit une commande, le système vérifiera les répertoires dans cet ordre pour l'exécutable.
      • LANG : les paramètres actuels de langue et de localisation, y compris le codage de caractères.
      • HOME : le répertoire d'accueil de l'utilisateur actuellement connecté.
      • _ : la plus récente des précédentes commandes exécutées.

      En plus de ces variables d'environnement, vous verrez souvent les variables de shell suivantes :

      • BASHOPTS : la liste des options qui ont été utilisées lorsque bash a été exécuté. Cette variable peut s'avérer utile pour savoir si l'environnement de shell fonctionne de la manière dont vous le souhaitez.
      • BASH_VERSION : la version de bash en cours d'exécution, dans un format lisible par l'humain.
      • BASH_VERSINFO : la version de bash en cours d'exécution, dans un format lisible par une machine.
      • COLUMNS : le nombre de colonnes larges qui servent à dessiner le résultat à l'écran.
      • DIRSTACK : la pile des répertoires qui sont disponibles avec les commandes pushd et popd.
      • HISTFILESIZE : le nombre de lignes d'historique de commande enregistrées dans un fichier.
      • HISTSIZE : le nombre de lignes d'historique de commandes autorisées en mémoire.
      • HOSTNAME :le nom d'hôte de l'ordinateur du moment.
      • IFS : le séparateur de champ interne utilisé pour séparer les entrées sur la ligne de commande. Un espace est utilisé par défaut.
      • PS1 : la configuration de l'invite de la commande principale. Cette variable sert à définir à quoi ressemble votre invite lorsque vous commencez une session de shell. La variable PS2 permet de déclarer des invites secondaires lorsqu'une commande s'étend sur plusieurs lignes.
      • SHELLOPTS : les options de shell qui peuvent être configurées avec l'option set.
      • UID : l'IUD de l'utilisateur actuellement connecté.

      Configuration des variables de shell et d'environnement

      Pour vous aider à mieux comprendre la différence entre les variables de shell et les variables d'environnement et vous présenter la syntaxe à utiliser pour ces variables, nous allons faire une petite démonstration.

      Création de variables de shell

      Nous allons commencer par configurer une variable de shell dans notre session en cours. Ceci est facile à réaliser, nous n'avons qu'à spécifier un nom et une valeur. Nous allons adhérer à la convention qui consiste à utiliser uniquement des majuscules pour le nom de la variable et à la configurer sur une chaîne simple.

      Ici, nous avons utilisé des guillemets, car la valeur de notre variable contient un espace. De plus, nous avons utilisé des guillemets simples, car le point d'exclamation est un caractère spécial dans le shell bash qui se développe généralement en historique bash si on n'en sort pas ou s'il n'est pas mis entre des guillemets simples.

      Nous disposons maintenant d'une variable de shell. Cette variable est disponible dans notre session en cours, mais elle ne sera pas transmise aux processus enfant.

      Nous pouvons voir cela en recherchant notre nouvelle variable dans le résultat de set :

      Output

      TEST_VAR='Hello World!'

      Nous pouvons vérifier s'il ne s'agit pas d'une variable d'environnement en essayant la même méthode avec printenv :

      Aucun résultat ne devrait être renvoyé.

      Utilisons cela comme une opportunité de présenter un moyen d'accéder à la valeur de toute variable de shell ou d'environnement.

      Output

      Hello World!

      Comme vous pouvez le voir, vous faites référence à la valeur d'une variable en la faisant précéder d'un signe $. Le shell considère que cela signifie qu'il devrait substituer la valeur de la variable lorsqu'il la rencontre.

      Nous disposons donc maintenant d'une variable de shell. Elle ne devrait être transmise à aucun processus enfant. Nous pouvons générer un shell bash new à partir de notre shell actuel pour le démontrer :

      Si nous saisissons bash pour générer un shell enfant, puis tentons d'accéder ensuite au contenu de la variable, aucun résultat ne sera renvoyé. C'est ce à quoi nous nous attendions.

      Revenont à notre shell d'origine en saisissant exit :

      Création de variables d'environnement

      Maintenant, transformons notre variable de shell en variable d'environnement. Pour se faire, il faut exporter la variable. La commande qui permet de le faire se nomme à juste titre :

      Cela permettra de transformer notre variable en variable d'environnement. Nous pouvons vérifier cela en contrôlant à nouveau notre liste d'environnements :

      Output

      TEST_VAR=Hello World!

      Cette fois, notre variable s'affiche. Recommençons notre expérience avec notre shell enfant :

      Output

      Hello World!

      Super ! Notre shell enfant a reçu la variable définie par son parent. Avant de quitter ce shell enfant, essayons d'exporter une autre variable. Nous pouvons configurer les variables d'environnement en une seule étape, comme suit :

      • export NEW_VAR="Testing export"

      Vérifiez qu'elle est bien exportée en tant que variable d'environnement :

      Output

      NEW_VAR=Testing export

      Maintenant, retournons dans notre shell d'origine :

      Voyons si notre nouvelle variable est disponible :

      Aucun résultat n'est renvoyé.

      En effet, les variables d'environnement ne sont transmises qu'aux processus enfant. Il n'existe pas de moyen intégré de configurer les variables d'environnement du shell parent. Ce qui est une bonne chose dans la plupart des cas. Cela empêche également les programmes de modifier l'environnement d'exploitation à partir duquel ils ont été appelés.

      La variable NEW_VAR a été configurée comme une variable d'environnement dans notre shell enfant. Cette variable serait disponible pour elle-même et tous ses shells et processus enfant. Lorsque nous sommes revenus à notre shell principal, cet environnement a été détruit.

      Rétrogradation et annulation des variables

      Notre variable TEST-VAR est toujours définie comme une variable d'environnement. Nous pouvons la reconvertir en une variable de shell en saisissant :

      Il ne s'agit plus d'une variable d'environnement :

      Cependant, il s'agit toujours d'une variable deshell :

      Output

      TEST_VAR='Hello World!'

      Si nous voulons annuler complètement une variable, qu'elle soit de shell ou d'environnement, nous pouvons le faire avec la commande unset :

      Nous pouvons vérifier qu'elle n'est plus configurée :

      Aucun résultat n'est renvoyé car la variable a été annulée.

      Configuration de variables d'environnement à la connexion

      Nous avons déjà mentionné que de nombreux programmes utilisent des variables d'environnement pour décider des spécificités de l'utilisation de ces variables. Nous ne voulons pas avoir à configurer d'importantes variables à chaque fois que nous lançons une nouvelle session shell. Nous avons d'ailleurs déjà vu combien de variables sont déjà configurées lors de la connexion. Alors, de quelle manière créer et configurer des variables automatiquement ?

      Il s'agit en fait d'un problème plus complexe qu'il n'y paraît initialement, en raison des nombreux fichiers de configuration que le shell bash doit lire en fonction de la manière dont il est démarré.

      La différence entre les sessions de shell Login, Non-Login, Interactive et Non-Interactive

      Le shell bash lit différents fichiers de configuration en fonction de la façon dont la session est lancée.

      Il existe une manière de distinguer les différentes sessions qui consiste à établir si le shell est généré comme une session de login ou non-login.

      Un shell de login est une session de shell qui commence par l'authentification de l'utilisateur. Si vous vous connectez à une session via un terminal ou SSH et que vous vous authentifiez, votre session sera considérée comme un shell de login.

      Si vous démarrez une nouvelle session shell à partir de votre session authentifiée, comme nous l'avons fait en appelant la commande bash à partir du terminal, une session shell de non-login sera lancée. Vos données d'authentification ne vous ont pas été demandées lorsque vous avez démarré votre shell enfant.

      On peut également noter une autre distinction qui consiste à déterminer si une session de shell est interactive ou non-interactive.

      Une session shell interactive est une session shell qui est rattachée à un terminal. Une session shell non-interactive est une session qui n'est pas rattachée à une session de terminal.

      Donc, chaque session shell est classée comme étant de login ou non-login et interactive ou non-interactive.

      Une session normale qui commence par SSH est généralement une session shell de login interactive. Un script exécuté à partir de la ligne de commande est généralement exécuté dans une session shell non-interactive et non-login. Une session de terminal peut être une combinaison de ces deux propriétés.

      Que la session soit classée comme un shell de login ou non-login a des implications sur les fichiers à lire pour initialiser la session de shell.

      Une session lancée par comme une session de login lira les détails de configuration tout d'abord à partir du fichier /etc/profile. Ensuite, elle recherchera le premier fichier de configuration de shell de login qui se trouve dans le répertoire d'accueil de l'utilisateur pour obtenir des détails de configuration spécifiques.

      Elle lit le premier fichier qu'elle peut trouver sur ~/.bash_profile, ~/.bash_login et ~/.profile, et ne lit aucun autre fichier.

      En revanche, une session définie comme un shell de non-login lira le fichier /etc/bash.bashrc puis ~/.bashrc spécifique à l'utilisateur pour créer son environnement.

      Les shells non-interactifs lisent la variable d'environnement appelée BASH_ENV et lisent le fichier spécifié pour définir le nouvel environnement.

      Implémentation de variables d'environnement

      Comme vous pouvez le voir, il existe un grand nombre de fichiers différents que nous devrons généralement consulter pour placer nos paramètres.

      Cela permet une grande flexibilité et nous sera d'une grande utilité dans des situations spécifiques, lorsque nous souhaiterons avoir certains paramètres dans un shell de login et d'autres paramètres dans un shell de non-login. Cependant, la plupart du temps nous voudrons avoir les mêmes paramètres dans les deux situations.

      Heureusement, la plupart des distributions Linux configurent les fichiers de configuration de login pour obtenir les fichiers de configuration de non-login. Cela signifie que vous pouvez configurer les variables d'environnement que vous souhaitez avoir dans les deux à l'intérieur des fichiers de configuration de non-login. Ils seront ensuite lus dans les deux scénarios.

      Nous configurerons généralement des variables d'environnement spécifiques à l'utilisateur et souhaiterons que nos réglages soient disponibles dans les deux shells, de login et de non-login. Cela signifie que l'endroit où configurer ces variables se trouve dans le fichier ~/.bashrc.

      Maintenant, ouvrez ce fichier :

      Il est probable qu'il contienne déjà un certain nombre de données. La plupart des définitions ici servent à la configuration des options bash, qui ne sont pas liées à des variables d'environnement. Vous pouvez configurer les variables d'environnement comme vous le feriez avec la ligne de commande suivante :

      Toute nouvelle variable d'environnement peut être ajoutée n'importe où dans le fichier ~/.bashrc tant qu'elle n'est pas placée au milieu d'une autre commande ou pour une boucle. Ensuite, nous pouvons sauvegarder et fermer le fichier. La prochaine fois que vous lancerez une session de shell, la déclaration de votre variable d'environnement sera lue et transmise à l'environnement shell. Vous pouvez forcer votre session actuelle à lire le fichier en saisissant ce qui suit :

      Si vous devez configurer des variables à l'échelle du système, vous devriez éventuellement envisager de les ajouter à /etc/profile, /etc/bash.bashrc, ou /etc/environment.

      Conclusion

      Les variables d'environnement et de shell sont toujours présentes dans votre session shell et peuvent s'avérer très utiles. Il s'agit d'un moyen intéressant pour un processus parent de paramétrer les détails de configuration de ses processus enfant et de configurer des options en-dehors des fichiers.

      Ce qui peut être très avantageux dans des situations spécifiques. Par exemple, certains mécanismes de déploiement dépendent des variables d'environnement pour configurer les données d'authentification. Ceci est utile, car vous n'avez pas besoin de la conserver dans des fichiers qui pourraient être vus par des tiers.

      Il existe de nombreux autres scénarios, plus banals, mais plus courants, dans lesquels vous devrez lire ou modifier l'environnement de votre système. Avec ces outils et ces techniques, vous disposez d'une bonne base pour apporter ces modifications et les utiliser correctement.



      Source link