İşlemler ebeveynin çevresini miras alıyorsa, neden ihracata ihtiyacımız var?


72

Buradaexport bir kabuktaki amacın değişkeni kabuktan başlayan alt işlemlere uygun hale getirmek olduğunu okudum .

Ancak, ben de okudum burada ve burada o "Süreçler onların ebeveyni (onlara ait süreç) kendi ortamını devralır."

Bu durumda, neden ihtiyacımız var export? Neyi kaçırıyorum?

Kabuk değişkenleri varsayılan olarak ortamın bir parçası değil midir? Fark ne?

Yanıtlar:


74

Varsayım, kabuk değişkenlerinin çevrede olduğu . Bu yanlış. exportKomut hiç ortamda olmak üzere bir ad tanımlayan şeydir. Böylece:

a=1 b=2
export b

Geçerli sonuçları kabuğun bilerek $a1'e ve genişler $b2'ye fakat subprocesses hakkında hiçbir şey bilmeyecek açevreye (hatta cari kabuk) bir parçası değildir çünkü.

Bazı faydalı araçlar:

  • set: Geçerli kabuğun parametrelerini görüntülemek için kullanışlıdır, verilmiş veya verilmemiş
  • set -k: Çevreye atanan argümanları ayarlar . Düşünmekf() { set -k; env; }; f a=1
  • set -a: Kabuğa, çevreye ayarlanan herhangi bir adı girmesini söyler. exportHer görevden önce koymak gibi . Olduğu .envgibi dosyalar için kullanışlıdır set -a; . .env; set +a.
  • export: Kabuğa çevreye bir isim koymasını söyler. İhracat ve atama, tamamen farklı iki işlemdir.
  • env: Harici bir komut olarak, envsize yalnızca kalıtsal ortam hakkında bilgi verebilir , bu nedenle akıl sağlığı kontrolünde yararlıdır.
  • env -i: Bir alt işleme başlamadan önce çevreyi temizlemek için kullanışlıdır.

Alternatifleri export:

  1. name=val command # Komuttan önce Atama bu adı komuta verir.
  2. declare/local -x name # Adı dışa vurmaktan kaçınmak istediğinizde özellikle kabuk işlevlerinde yararlı olan bir ad verir.
  3. set -a # Sonraki her ödevi verir.

3
set -konun cmd ENVVAR=valueyerine kullanabilmeniz için, çağrılmadan önce çalıştırılmadıkça ENVVAR=value cmd, örneğinizde çalışmaz . Ayrıca, günümüzde pek çok kabuk onu desteklememektedir ve yalnızca Bourne kabuğuyla geriye dönük uyumluluk için desteklemektedir. Bourne (veya Korn) kabuğunda bu fonksiyonlar için işe yaramaz. Ve kabuk ayrıştırmayı etkilediği için, kabuğun orada kullandığı kodu okuduğu zaman yürürlükte olması gerekir. set -kf
Stéphane Chazelas

1
Ayrıca bahsetmek isteyebilirsinizset -a
Stéphane Chazelas

24

Kabuk değişkenleri ve çevre değişkenleri arasında bir fark var. Eğer bir kabuk değişkeni girmeden tanımlarsanız export, süreç ortamına eklenmez ve bu nedenle çocuklarına miras kalmaz.

Kullanarak exportkabuğa kabuk değişkenini ortama eklemesini söyleyin. Bunu kullanarak test edebilirsiniz printenv(ortamını sadece yazdırır stdout, çünkü exporting değişkenlerinin etkisini gördüğünüz bir alt işlemdir ):

#!/bin/sh

MYVAR="my cool variable"

echo "Without export:"
printenv | grep MYVAR

echo "With export:"
export MYVAR
printenv | grep MYVAR

6

Bir kez dışa aktarılan bir değişken ortamın bir parçasıdır. PATHÖzel değişkenler gerektiğinde dışa aktarılabilirken kabuğun kendisinde dışa aktarılır. Bazı kurulum kodlarını kullanarak:

$ cat subshell.sh 
#!/usr/bin/env bash
declare | grep -e '^PATH=' -e '^foo='

Karşılaştırmak

$ cat test.sh 
#!/usr/bin/env bash
export PATH=/bin
export foo=bar
declare | grep -e '^PATH=' -e '^foo='
./subshell.sh
$ ./test.sh 
PATH=/bin
foo=bar
PATH=/bin
foo=bar

İle

$ cat test2.sh 
#!/usr/bin/env bash
PATH=/bin
foo=bar
declare | grep -e '^PATH=' -e '^foo='
./subshell.sh
$ ./test2.sh 
PATH=/bin
foo=bar
PATH=/bin

Yana fookabuk tarafından ihraç yapılmayacağını ve test2.shbunu ihraç asla, bu ortamının parçası değildi subshell.shson dönemde.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.