“_ =” Ne anlama geliyor?


29

Çalıştırdıktan sonra set -a var=99, çıktısında bir cümle bulabilirim set:

...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...

Birisi bana "_ =" nin ne anlama geldiğini söyleyebilir mi?

Bunun echo $varhiçbir şey vermeyeceğini not ediyorum . Eğer çalıştırırsam set -a, o zaman setbu değişkeni tekrar içermeyecek. Ne oluyor?


Yanıtlar:


16

Yürüttüğünüzde set -a var=99, üç farklı şey gerçekleşir (sorunuzla ilgili):

  1. Dışa aktarmak için bir set seçeneği ( -a) (yaparak ters set +a) değişkendir.
  2. Konumsal parametreler seçenekleri izleyenlere "ayarlanır" (olarak $1ayarlanır var=99).
  3. Alttaki kabuk değişkeni $_son parametreye ayarlanır (genişletilmiş).

-a ayarla

Yürütülmesi set -aişaretleri her bir sonraki (yeni veya değiştirilmiş) (hariç tüm kabuklarında dışa gibi değişkenler cshve bunlarla ilişkili kabukları).

$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer

Bu ayardan kurtarmak için, sadece değiştirmek -bir için +:

$ set +a
$ unset myvariable              # to erase it from the environment if it
                                # was exported before the change of set +a
$ myvariable=456544654          # A new value of the variable.
$ env | grep "variable"         # No output means the var does not exist
                                # in the current environment

var = 99 olarak ayarla

Aslında set -- var=99bir seçeneğin yorumlanmasından kaçınmak gerekir (ve sette bir çizgi vardır -) , kısa çizgi ( ) ile başlayan değerlere sahiptir .

Argümanların listesini (konumsal parametrelerin listesi), ardından gelenlere ayarlar --. Bu, tüm makul kabuklarda geçerlidir (csh ve ark. Değil). Konumsal argümanlar "$ @" ile (veya benzer değil "$ *" ile aynı).

$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3

_ = Last_argument

Ve iç kabuk değişkeninin değeri _, yürütülen satırın son argümanına değişir. Yani DEĞİL neredeyse tüm kabuklarda (JSH, kül, yash, tire, lksh, mksh, ksh93, attsh ve ders csh ve tcsh ait) bash haricinde gerçek.

$ echo one two last argument
one two last argument

$ echo "$_"
argument

$ echo This is a new: last_argument
This is a new: last_argument

$ echo "$_"
last_argument

Lütfen $_, değerin genişlemeden sonraki değer olduğunu unutmayın :

$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument

$ echo "$_"
A New_Argument

Bu yüzden yürütürken:

$ set -a myvar=99; set | grep 'myvar'
_=myvar=99

'$ _' Kabuk değişkeninin açıklamasını alırsınız. Bu aynı zamanda çalışır:

$  set -a myvar=99; declare -p _
declare -- _="myvar=99"

37

Alt çizgi aslında özel bir kabuk değişkenidir. Burada ne görüyorsanız, değeri olan underscore ( _) değişkenidir var=99. Salt okunur ve kabuk tarafından korunur. Bu:

  • Argüman listesinde geçirildiği şekilde yürütülmekte olan kabuğun veya betiğin mutlak dosya adını içeren kabuk başlangıcında ayarlayın.
  • Bundan sonra, genişlemeden sonra, önceki komutun son argümanına genişler.
  • Postaları kontrol ederken, bu parametre posta dosyasının adını tutar.
  • Ayrıca, çalıştırılan ve o komuta verilen ortama yerleştirilen her komutun tam yoluna da ayarlanır.

Örneğiniz ikinci kategoriye giriyor. Sen yazdın

set -a var=99  

Geçen argüman Yani orada var=99ve olmasıydı değeri (eğer ayarı değildi kuruyorduk variçin 99). Dolayısıyla, _buna ayarlandı. Ve rapor edilen budur:

_=var=99  

Biraz kafa karıştırıcı, ancak ilki =değişkene yapılan atamayı _, ikincisi ise değerin bir parçası.

Ayrıca, daha sonra tanımlanmış tüm değişkenlerin dışa aktarılmasına neden olacak -aseçeneğinin belirtilmesi setde önemlidir.


16

Doğru cevap kullandığınız kabuğa bağlı olacaktır:

  • çünkü bash, @BobEager ne olursa olsun geçerlidir
  • için zsh, sadece bir önceki komuta son argüman olarak ayarlanır ve komutun ortamda komuta tam yolunu edilir
  • Bazı mermiler dashetkileşimli bir oturum çalıştırırken yalnızca bu değişkeni ayarlamak gibi

Diğer kabuklarda başka özellikler de olabilir. Bunun gibi, $_bir tanımlanmamış onu kullanırken bir potansiyel taşınabilirlik sorunları bilmelidir yüzden POSIX'deki.

Not: Niyetiniz, 99'a bir değer vermek varve onu takip eden alt işlemlerin ortamında kullanılabilir hale getirmekse, bunu başarmak için doğru sözdizimi şöyledir:

export var=99

2
Bir de doğru sözdizimi unset var;set -a; var=99. Tüm rezonanslı mermilerde çalışır (csh et al).
Arrow

1
@Arrow Bob Eager'in cevabının son satırına göre, bu daha sonra ayarlanan / değiştirilen dışa aktarılmış tüm değişkenleri yapacaktır , bu istediğiniz gibi olmayabilir.
TripeHound

8

Ve echo $varnotum hiçbir şey vermeyecek. … Ne oldu?

Bash'ın çok iyi olmayan baskısında (1) ,

set[ --abefhkmnptuvxBCEHPT] [ seçenek adı ] [ arg …]   [ ] [ seçenek adı ] [ arg …]-o
set+abefhkmnptuvxBCEHPT+o

            Options
    Seçenekler belirtildiğinde, kabuk özelliklerini belirler veya ayarlar. Seçenek işlemlerinden kalan Herhangi argümanlar için, sırayla, konumsal parametreler için değerler olarak kabul edilir ve atanır $1, $2... .$n

Hangi araçlar, set -a var=99ortam değişkeni ayarlamak gelmez varetmek 99; Koyduğu $1için var=99. Deneyin echo "$1"ya echo "$*"da göreceksiniz.

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.