Kabuk değişkenlerinin dışa aktarılıp aktarılmadığını nasıl belirlersiniz?


13

Bourne kabuk ailesi ile, kabuk değişkenlerinin hepsinde büyük harf adı vardır; başka bir deyişle, belirli bir değişkenin bir ortam değişkeni olup olmadığını yalnızca adına bakarak anlatamazsınız. Hangi Bourne kabuğu değişkenlerinin yerel olduğunu nasıl belirlersiniz (yalnızca geçerli kabukta tanımlanır)?


4
Bourne kabuğu mu yoksa Bourne-tekrar kabuğu mu? Büyük harfli değişken şey için bir referansı gösterebilir misiniz?
Jeff Schaller

Bourne-again kabuğunda tüm değişkenler büyük harf olduğundan, hangi bash değişkenlerinin yerel olduğunu nasıl belirleyebilirsiniz?
Shoulderpadz

7
@Shoulderpadz hiçbir şey küçük harfli değişkenler oluşturmanızı engellemez.
muru

1
By yerel dışa edilmemiş değişkenler demek?
Eliah Kagan

4
Sorduğunuz ayrım, küresel ve yerel değil, kabuk değişkenleri ile çevre değişkenleridir. Ortam değişkenleri olmayan kabuk değişkenleri (yani, "yerel" olarak adlandırdığınız şey) olduğunu ve kabuk değişkenleri olmayan ortam değişkenleri olduğunu unutmayın (ortam, geçerli kabuk tanımlayıcıları olmayan adlar içerebilir ve bu nedenle değişken olamaz).
chepner

Yanıtlar:


17

Bir değişkenin dışa aktarılıp aktarılmadığını görmek istiyorsanız şunu kullanın declare:

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"

26

En taşınabilir yol export -p.

export -pdışa aktarılan değişkenleri listeler. Bu genellikle gibidir declare -x, eğer senin kabuk vardır declare.

Halen kullanılmakta olan Bourne tarzı mermiler export -p, POSIX'in gerektirdiği şekilde desteklemelidir :

Ne zaman -p belirtilmişse, ihracat standart çıkışa aşağıdaki biçimde tüm ihraç değişkenlerin adlarını ve değerlerini, yazacak:

"export %s=%s\n", <name>, <value>

eğer adı ayarlanır ve:

"export %s\n", <name>

eğer adı düzdür.

Standart , değişkenin değerinin, genellikle =bir ödevin sağ tarafında daha sonra kullanılmasına izin verecek şekilde görüntülendiğini açıklar . Bu, alıntılanabileceği anlamına gelir. Farklı mermiler farklı gösterebilir fakat aynı etkiye sahiptir. Dash gibi yerleşik export -polmayan kabuklarda bile çalışır .declare

$ dash -c 'export -p | grep HOME='  # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME='  # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek

Çıktıyı grepkompaktlık için kullandım, ancak filtrelemezseniz dışa aktarılan değişkenlerin tam listesini alırsınız. Sorunuzdan, en yararlı bulabileceğiniz gibi görünüyor.

Bash gibi bazı mermiler, açıkça POSIX uyumlu bir şekilde davranmaları istenmedikçe standart olmayan bir biçim kullanır. Bash'te varsayılan export -polarak aynı çıktıyı verir declare -x.

$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME='  # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"

Zsh, POSIX uyumluluğu etkinleştirilmiş olsa bile standart olmayan bir biçim gösterir:

$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek

Her durumda, ardından bir sözcük arayarak taşınabilir ifadeleri (alıntılanabilir) çıkarabilirsiniz =. Bu kadar uzun hemen önce gelmez yaptığı gibi, on line Önceki kelimelere dayanmaz =oldukları olmamalı. Örneğin:

% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....

Not değil tüm girişler mutlaka var =. Bunun nedeni değişkenlerin ayarlanamaması ancak dışa aktarılabilmesidir. Bu girişler, grepyukarıdaki komutla filtrelenir ; bu, istediğiniz gibi olabilir veya olmayabilir.

Çoğu zaman, sadece çıkış incelemek istiyoruz ve girişleri öncesinde Biz burada son bakım alışkanlık export, declare -x, typeset -x, ya da başka bir şey. Sonra sadece koş export -p.

Bu komutları her kabuğun resmi paketlenmiş sürümleriyle Ubuntu 16.04 LTS'de test ettim .


0

Olan değişkenler DEĞİL ihraç çıkışından görülebilir declarebash komutu.

Değişkenler edilir ihraç çıkışından görülebilir declare -xveya exportbash komutu.

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.