masalah variabel lingkungan di shell


1

Saya menggunakan Red Hat Linux Enterprise 5. Saya tahu teori bahwa - menggunakan ekspor untuk mengatur variabel lingkungan, variabel lingkungan akan berlaku untuk lingkungan saat ini dan anak, tetapi tanpa menggunakan ekspor untuk mengatur variabel lingkungan, variabel lingkungan hanya akan berlaku untuk lingkungan saat ini.

Kebingungan saya adalah, apa definisi yang tepat dari "lingkungan anak" dan "lingkungan saat ini"? Sebagai contoh,

$ var1=123
$ echo "Hello [$var1]"

nilai var1 (yang 123) dicetak dalam shell, tapi saya pikir gema adalah perintah yang dipanggil oleh shell saat ini, dan itu (perintah echo) harus menjadi lingkungan anak dari shell saat ini dan nilai var1 seharusnya tidak (karena tidak menggunakan export var1 = 123) gema dampak. Ada komentar?

Terima kasih sebelumnya!

Jawaban:


3

Variabel diperluas di lingkungan saat ini.

$ set -x    # turn on tracing
$ var1=123
+ var1=123
$ echo "Hello [$var1]"
+ echo 'Hello [123]'
Hello [123]
$ set +x

Seperti yang dapat Anda lihat dari jejak (garis yang dimulai dengan "+"), echolihat "Halo [123]". Tidak pernah mendapatkan variabel.

Seperti yang Anda lihat dari jawaban gogiel untuk pertanyaan Anda yang lain, variabel lingkungan yang diekspor memang memengaruhi lingkungan anak:

$ echo $LANG
en_US.UTF-8
$ declare -p LANG   # the response includes "-x" which shows the variable is already marked for export
declare -x LANG="en_US.UTF-8"
$ ls --help | head -n 4
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
$ LANG=es_MX.utf8 ls --help | head -n 4
Uso: ls [OPCIÓN]... [FICHERO]...
Muestra información acerca de los ARCHIVOS (del directorio actual por defecto).
Ordena las entradas alfabéticamente si no se especifica ninguna de las opciones -cftuSUX ni --sort.

Atau saya bisa menetapkan nilai LANGdi lingkungan saat ini dan karena diekspor, itu akan diwarisi oleh lingkungan anak:

$ LANG=es_MX.utf8
$ grep --help | head -n 4
Modo de empleo: grep [OPCIÓN]... PATRÓN [FICHERO]...
Busca un PATRÓN en algún ARCHIVO o entrada estándar.
PATTERN es, por omisión, una expresión regular básica (BRE).
Ejemplo: grep -i '¡Hola, mundo!' menu.h main.c
$ sed --help | head -n 4
Uso: sed [OPCIÓN]... {guión-sólo-si-no-hay-otro-guión} [fichero-entrada]...

  -n, --quiet, --silent
                 suprime la muestra automática del espacio de patrones
$ while [[ = 4 ]]    # create an error on purpose to show Spanish error message
bash: se esperaba un operador binario condicional
bash: error sintáctico cerca de `4'

Sunting:

Berikut ini adalah skrip sederhana (sebut saja showvars) sehingga Anda dapat melihat apa yang terjadi di dalam dan di luar.

#!/bin/bash
arguments="$@"
printf "The script has started.\n"
printf "These are the parameters passed to the script: [$arguments]\n"
scriptvar=100
printf "This is the value of scriptvar: [$scriptvar]\n"
printf "This is the value of exportvar: [$exportvar]\n"
printf "This is the value of shellvar: [$shellvar]\n"
printf "This is the value of commandvar: [$commandvar]\n"
printf "The script has ended.\n"

Sekarang kita lakukan langkah-langkah ini di prompt shell:

$ shellvar=200
$ export exportvar=300
$ ./showvars 400 $shellvar 500
The script has started.
These are the parameters passed to the script: [400 200 500]
This is the value of scriptvar: [100]
This is the value of exportvar: [300]
This is the value of shellvar: []
This is the value of commandvar: []
The script has ended.
$ commandvar=600 ./showvars 400 $shellvar 500
The script has started.
These are the parameters passed to the script: [400 200 500]
This is the value of scriptvar: [100]
This is the value of exportvar: [300]
This is the value of shellvar: []
This is the value of commandvar: [600]
The script has ended.
$ printf "This is the value of commandvar: [$commandvar]\n"
This is the value of commandvar: []
$ commandvar=600
$ ./showvars 400 $shellvar 500
The script has started.
These are the parameters passed to the script: [400 200 500]
This is the value of scriptvar: [100]
This is the value of exportvar: [300]
This is the value of shellvar: []
This is the value of commandvar: []
The script has ended.
$ printf "This is the value of scriptvar: [$scriptvar]\n"
This is the value of scriptvar: []
$ printf "This is the value of exportvar: [$exportvar]\n"
This is the value of exportvar: [300]
$ printf "This is the value of shellvar: [$shellvar]\n"
This is the value of shellvar: [200]
$ printf "This is the value of commandvar: [$commandvar]\n"
This is the value of commandvar: [600]

Seperti yang Anda lihat shellvartidak tersedia di dalam skrip dan scriptvartidak tersedia di luarnya. Sejak exportvardiekspor, tersedia di dalam dan di luar skrip. Dan commandvarhanya tersedia di dalam skrip ketika dilewatkan di baris perintah saat memanggil skrip. Jika diatur di lingkungan interaktif dan kemudian skrip disebut, itu hanya tersedia di lingkungan interaktif.


1
Ya, variabel diperluas oleh shell (itu menggantikan variabel dengan nilainya) dan nilai diteruskan ke echo. Jadi echotidak pernah melihat variabel, hanya nilainya.
Dennis Williamson

1
@ George2: Lihatlah jejak di bagian atas jawaban saya. "$" Adalah prompt shell. Saya mengetik echo "Hello [$var1]"dan baris berikutnya (yang dimulai dengan "+") menunjukkan apa yang sebenarnya terjadi. Shell (Bash) memberi tahu echokeluaran "123". Shell mengganti nama variabel dengan nilainya sebelum memberikannya echosehingga echotidak pernah melihat variabel itu hanya melihat nilai yang diteruskan sebagai parameter. Saya akan menambahkan skrip kecil ke jawaban saya yang akan menunjukkan apa yang terjadi dengan membiarkan Anda melihat di dalam proses. Ini akan memakan waktu beberapa menit, jadi periksa kembali jika belum ada.
Dennis Williamson

1
@ George2: Entitas seperti apa? mkdiradalah anak dari lingkungan apa pun itu berasal - shell interaktif atau script, misalnya. Biasanya executable tersebut hanya dipengaruhi oleh variabel lingkungan yang diekspor yang didokumentasikan di manhalaman mereka . Satu jenis variabel lingkungan yang sering kali efektif meskipun tidak didokumentasikan dalam manhalaman individual adalah sekumpulan variabel terkait lokal seperti yang LANGditunjukkan dalam beberapa contoh di atas.
Dennis Williamson

1
executable, skrip, perintah, ya.
Dennis Williamson

1
Tidak, tidak terkecuali. Lihat di file="/etc/passwd"; ls -l "$file"sini lsmenerima nilai variabel dari shell induk. The nilai tidak variabel itu sendiri .
Dennis Williamson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.