Bash kabuğunun ortam değişkeni ne zaman?


10

Bash Manual diyor (manpage, benim vurgu):

Bash harici bir komut çağırdığında, değişken komutun $_tam yol adına ayarlanır ve ortamındaki bu komuta iletilir.

Ve ( Özel Parametreler ):

_

( $_, alt çizgi.) Kabuk başlangıcında, ortam veya bağımsız değişken listesinde geçirildiği sırada yürütülen kabuk veya kabuk komut dosyasını çağırmak için kullanılan mutlak yol adına ayarlayın. Daha sonra, genişletmeden sonra önceki komutun son bağımsız değişkenine genişler. Ayrıca, bu komuta aktarılan ortama yürütülen ve yerleştirilen her komutu çağırmak için kullanılan tam yol adına ayarlanır. Postaları kontrol ederken, bu parametre posta dosyasının adını tutar.

  1. Bir bash kabuğunda koşuyorum:

    $ bash
    $ export | grep '_=' 

    El kitabına göre _, yeni bash kabuğunun ortam değişkeni olmalıdır. exportyeni bash kabuğunun tüm ortam değişkenlerini çıkarması gerekiyor, ancak çıkmıyor _. Bu yüzden _yeni bash kabuğunun ortam değişkeni olup olmadığını merak ediyorum.

  2. Aslında herhangi bir bash kabuğunda aynı şey olur

    $ export | grep '_='

    hiçbir şey çıkarmaz. Acaba _hiç bir kabuk kabuğunun ortam değişkeni var mı?

  3. Karşılaştırma için:

    $ dash
    $ export  | grep '_='        
    export _='/bin/dash'

Yayımım Mike'ın yorumu ve Stephane'nin cevabından ilham alıyor .


1
Bu bir kabuk değişkendir ve komutun ortamına aktarılır ; kabuğun çevresine ihraç edilmesi gerekmez . exportbir yerleşiktir, ancak kullanırsanız printenv _size nasıl çağrıldığını gösterecektir: /usr/bin/printenvbu sistemde.
Toby Speight

O Not bash -c export | grep _=(Bash itibaren) olacaktır ebeveyn kabuk çağrılan göstermek basholsa komutu $_ebeveyn de düzdür.
Toby Speight

Yanıtlar:


13

Evet, _yeni Bash kabuğunun ortam değişkenidir; koşarak görebiliyorsun

tr '\0' '\n' < /proc/$$/environ | grep _=

kabuğun içinde: kabuğun başlangıç ​​ortamının içeriğini gösterir. İlk kabukta görmeyeceksiniz çünkü başlamadan önce ayarlamak için önceki bir kabuk yoktu.

Genişleyen $_Bash içinde belirtmektedir _önceki komut son bağımsız değişken genişler özel parametre. (Dahili olarak Bash bir kullanarak bu işler _bir komut ayrıştırılır her zaman güncellenen kabuk değişkeni, ama bu gerçekten bir uygulama ayrıntı. Bu bir komut ayrıştırılır her zaman “unexported” dır. ) exportGöstermez _değil mi çünkü dışa aktarılmış olarak işaretlenmiş bir değişken; ancak bunu çıktısında görebilirsiniz set.

İlk örnekte, yeni Bash kabuk ayrıştırır ve başlangıç dosyalarında komutları çalıştırır, böylece çalışırken explore | grep '-=', _zaten üzerine yazılır olmuştur ve dışa olarak işaretlenmiş.

In dashÖrneğin, çalıştırmadan önce Bash tarafından kuruldu bir ortam değişkeni olarak değişkeni görüyoruz böylece, herhangi bir başlangıç dosyasını çalıştırmak için görünmüyor dash.


Teşekkürler. Yeni bash kabuğunda neden export | grep '_='hiçbir şey çıkmıyor ? Orijinal bash kabuğunda neden tr '\0' '\n' < /proc/$$/environ | grep _=hiçbir şey çıkmıyor ?
Tim


9

exportargüman olmadan tüm dışa aktarılan değişkenleri listeler . _bir değişken değildir, ancak özel bir parametre olarak listelenir .

Biraz karışıklığa, _ayrıca olurdu bir değişken için geçerli bir ad diğer özel parametrelerin adlarının aksine,. En azından Bash 4.4, şikayetsiz olarak görevlendirilmesine izin verir. Yararlı değil çünkü özel efekt değeri hemen geçersiz kılar.


2
_;-) olsa bir değişken olarak kullanmaya çalışırken eğlenin . Etkin bir şekilde salt yazılır ve değer hemen kaybolur.
Stephen Kitt

1
Ayrıca, dahili olarak Bash _değişken olarak davranır , bu yüzden çıktısında görünür set. Ancak belirleyebildiğim kadarıyla ihraç edilmiş olarak işaretlenemez.
Stephen Kitt

2
@StephenKitt, ancak Bash 4.4 salt okunur olarak işaretlenmesine izin verir. Veya bir tamsayı. Biraz komik sonuçlarla.
ilkkachu

1
Ha, güzel bul, bu oldukça eğlenceli!
Stephen Kitt

5

Her kabuk değişkeni, çıktısında gördüğünüz gibi dışa aktarılmış olarak işaretlenmez declare -p.

Dışa aktarılmış olarak bashişaretlemenin bir anlamı yoktur, $_çünkü bu değişkeni alt süreçlerin ortamına otomatik olarak ekler, ancak kabuktaki değerden farklı bir değere sahiptir (o anda).

Dışa aktarılmış olarak göstermek, kullanıcıyı harici komutların ortamı ile ne olacağı konusunda karıştırır.

Tüm "çalışma zamanı değişkenleri" BASH*dışa aktarılmaz.

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.