TL; DR: export FOO=barBash, geçici ortam yaratımını başlatır, FOO=baro ortamda ayarlanır , sonra son komutunu verir export FOO. Bu noktada, FOOson argüman olarak ele alınır.
Ah, çok istismar edilmiş $_:
($ _, 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.
Birkaç varyasyona bakalım:
$ man; echo $_
What manual page do you want?
man
$ man foo; echo $_
No manual entry for foo
foo
$ echo; echo $_
echo
$ echo bar foo; echo $_
bar foo
foo
$ foo=x eval 'echo $foo'; echo $_
x
echo $foo
$ bar() { man $1; }; echo $_
foo
$ for (( i=0; $i<0; i=i+1 )); do echo $i; done; echo $_
foo
$ bar; echo $_
What manual page do you want?
man
$ bar foo; echo $_
No manual entry for foo
foo
$ MANPATH=/tmp; echo $_
$ export MANPATH=/tmp; echo $_
MANPATH
Burada üç model görüyoruz:
- Dosya sistemi, işlevler ve yerleşik öğelerden çağrılan komutlar genellikle beklendiği gibi davranır:
$_bağımsız değişken yoksa komut adının kendisine ayarlanır, aksi takdirde sunulan bağımsız değişkenlerin sonuncusu.
- İşlev tanımlarından, döngülerden ve diğer mantıksal yapılardan sonra:
$_değiştirilmez.
- Diğer her şey:
$_tam olarak beklenmeyen bir şeye ayarlanmıştır; tuhaf.
Ben kod gariplik hakkında bir fikir sağlamak için kullandım.
$ ./bash --noprofile --norc -c 'man foo'
lastword=[man]
lastarg=[foo]
$ ./bash --noprofile --norc -c 'export FOO=bar'
lastword=[export]
lastarg=[FOO=bar]
bind_variable, name=[FOO], value=[bar]
before bind_lastarg, lastarg=[FOO]
bind_lastarg, arg=[FOO]
bind_variable, name=[_], value=[FOO]
$ ./bash --noprofile --norc -c 'declare FOO=bar'
lastword=[declare]
lastarg=[FOO=bar]
bind_variable, name=[FOO], value=[(null)]
before bind_lastarg, lastarg=[FOO=bar]
bind_lastarg, arg=[FOO=bar]
bind_variable, name=[_], value=[FOO=bar]
Ayrıştırıcınınlastarg= tüm durumlarda beklenen son argümanı ( ) gördüğünü görebilirsiniz , ancak bundan sonra ne olacağı, bash'ın ne olacağını düşünmesine bağlıdır. Bkz. Execute_cmd.c, execute_simple_command () .
Durumunda export FOO=barbash atamayı yapar ve sonra değişkeni dışa aktarır. Bu, belgelerin genişlemeden sonra hesaplanan son argümanın iddialarıyla tutarlı görünmektedir.
EDITORihracat için bir argüman