Linux kabuğunda bir değişken ayarlarken set, env, declare ve export arasındaki fark nedir?


Yanıtlar:


5

Görünüşe göre set ve deklarasyon biraz daha farklı, set daha güçlü.

Altında "declare" Bkz https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins "Declare değişkenleri ve onları bağlıyor vermek hiçbir isim verilir, o zaman değişkenlerin değerleri görüntülemek: declare. yerine.

Https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin * set altında "set" ayarını yapın : "Bu yerleşik, kendi bölümünü hak edecek kadar karmaşıktır. kabuk seçeneklerinin değerlerini değiştirebilir ve konum parametrelerini ayarlayabilir veya kabuk değişkenlerinin adlarını ve değerlerini görüntüleyebilir. "

ENV, Bash'teki bir ortam değişkenidir: https://www.gnu.org/software/bash/manual/bash.html#Bash-Variables env bir Linux komutudur. Bunun iyi bir referans olduğunu düşünüyorum: /unix/103467/what-is-env-command-doing

Bunun ihracatın iyi bir açıklaması olduğunu düşündüm: http://www.unix.com/302531838-post2.html

Ayrıca: https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins * export (Bourne'den): "Ortamdaki alt süreçlere geçirilecek her adı işaretleyin."

Yukarıdaki URL'den borçlanma kodu:

root@linux ~# x=5                <= here variable is set without export command
root@linux ~# echo $x
5
root@linux ~# bash               <= subshell creation
root@linux ~# echo $x            <= subshell doesnt know $x variable value
root@linux ~# exit               <= exit from subshell
exit
root@linux ~# echo $x            <= parent shell still knows $x variable
5
root@linux ~# export x=5         <= specify $x variable value using export command
root@linux ~# echo $x            <= parent shell doesn't see any difference from the first declaration
5
root@linux ~# bash               <= create subshell again
root@linux ~# echo $x            <= now the subshell knows $x variable value
5
root@linux ~#

declareve setve env? ihracat vs beyan?
Pacerier

Bunu küçümsemeliyim çünkü bu sadece soruyu cevaplamıyor.
Daniel C. Sobral

Bunun daha iyi olup olmadığını bana bildirin.
Shawn P.

2

İlk olarak, bunu anlamalısınız environment variablesve shell variablesaynı şey değil.

Daha sonra, mermilerin nasıl çalıştığını yöneten niteliklere sahip olduğunu bilmelisiniz . Bu öznitelikler ortam veya kabuk değişkenleri değildir.

Şimdi, sorunuzu cevaplamaya devam edin.

  1. env: herhangi bir seçenek olmadan, geçerli ortam değişkenlerini değerleriyle gösterir; Ancak tek bir komut için ayarlanan ortam değişkeni için kullanılabilir -ibayrak
  2. set: seçenekler olmadan, her kabuk değişkeninin adı ve değeri man setrhel'de çalışmadan görüntülenir ; kabuk niteliğini ayarlamak için de kullanılabilir . Bu komut , ortam veya kabuk değişkeni ayarlamaz .
  3. declare: herhangi bir seçenek olmadan, aynı env; kabuk değişkenini ayarlamak için de kullanılabilir
  4. export: kabuk değişkenlerini ortam değişkenleri yapar

Kısacası:

  1. set kabuk veya ortam değişkenleri belirlemez
  2. env tek bir komut için ortam değişkenlerini ayarlayabilir
  3. declare kabuk değişkenlerini ayarlar
  4. export kabuk değişkenlerini ortam değişkenleri yapar

NOT declare -x VAR=VAL kabuk değişkenini oluşturur ve bunu dışa aktarır, böylece ortam değişkeni yapar.


Peki ya declare -gküresel bir değişken yaratacak, aynı zamanda çevrenin bir parçası olacak mı?
Bay Roland

1
Çevrenin bir parçası olmayacak. Global kapsamı olan bir kabuk değişkeni haline gelecektir. global scopeEfekti görmek için bir işlev oluşturmayı deneyebilirsiniz declare -g a=3. Bunu çalıştırdıktan sonra, değişken global olarak kapsamlandığından, işlevden çıktıktan sonra bile, değişken hala var olur (örneğin echo $ a ile başvurabilirsiniz)
Tran Triet
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.