“Export var = value” nerede mevcut değil?


31

İnşa ettim - muhtemelen Usenet’te 1990’ların ortalarında (!)

export var=value

bir bir basizmdir ve taşınabilir ifadenin

var=value
export var

Bunu yıllardır savunuyorum, ancak son zamanlarda birileri bana bu konuda meydan okudu ve benim eskiden inancımın ne olduğunu destekleyen bir belge bulamıyorum.

Google'a "export: command not found"gitmek, birinin gerçekten bu sorunu yaşadığı durumlar ortaya çıkmıyor gibi görünüyor, bu yüzden orijinal olsa bile, sanırım çok yaygın değil.

(I get hit kopya acemiler / yapıştırılan noktalama ve ile sona erdi gibi görünüyor 'export: command not foundya da bazı tür veya kullanmaya çalışırken exportile sudove acemi csh. Bourne kabuğu sözdizimi kullanmaya çalışıyor kullanıcılar)

Bunun OS X ve nerede sholduğu da dahil olmak üzere çeşitli Linux dağıtımlarında çalıştığını kesinlikle söyleyebilirim dash.

sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"'  # see that it really is exported
value

Günümüz dünyasında, bunun güvenli olduğunu söylemek export var=valuegüvenli midir?

Sonuçların ne olduğunu anlamak isterim. V7 "Bourne classic" için taşınabilir değilse, bu önemsiz şeylerden daha fazlası değildir. Kabuğun bu sözdizimi ile baş edemediği üretim sistemleri varsa, bunu bilmek faydalı olacaktır.


2
teşekkürler nihayet, neden sık sık düşündüğümü anladığımı anladım: işe yaramaz oldu: var = değer; ihracat var
Thorsten Staerk 28:15

2
Hala etrafta dolaşan birkaç Solaris kutusu var ve bunlar standart araçlarında meşhur görünüyor; Spektrumun diğer ucunda busybox, kendi minimal kabuğuyla gelmiyor mu? (Bu saniyeden sonra her ikisini de deneyebilecek durumda değilim.)
Ulrich Schwarz

Teşekkürler Ulrich, Solaris bu uzun sözdiziminin hala neden bu kadar önemli olduğu konusunda suçlu.
Thorsten Staerk

Yanıtlar:


20
export foo=bar

Bourne kabuğu ( shkülç / bash / ksh / yash / zsh gibi modern uygulamaların ortaya çıktığı 70'lerden kalma eski bir kabuk) tarafından desteklenmiyordu . Bu tarafından tanıtıldı ksh.

Bourne kabuğunda, şunları yaparsınız:

foo=bar export foo

veya:

foo=bar; export foo

veya set -k:

export foo foo=bar

Şimdi, davranışları:

export foo=bar

Kabuktan kabuğa değişir.

Sorun, atamalar ve basit komut argümanlarının farklı şekilde ayrıştırılması ve yorumlanmasıdır.

foo=barÜzerinde bir atama (bazen) gibi bir komut bağımsız değişken olarak bazı kabukları ve diğerleri tarafından yorumlanır.

Örneğin,

a='b c'
export d=$a

olarak yorumlanır:

'export' 'd=b' 'c'

Bazı mermilerde ( ash, eski versiyonları zsh(sh emülasyonda) yash) ve:

'export' 'd=b c'

diğerlerinde ( bash, ksh).

Süre

export \d=$a

veya

var=d
export $var=$a

tüm kabuklarda aynı şekilde yorumlanacaktır, 'export' 'd=b' 'c'çünkü ters eğik çizgi veya dolar işareti, bu argümanları atama olarak değerlendirmeyi destekleyen kabukları durdurur.

Eğer exportkendisinden alıntı yapılmışsa veya bir miktar genişlemenin sonucu (kısmen de olsa), kabuğa bağlı olarak, özel muameleyi almayı da durduracaktır.

Bununla ilgili daha fazla ayrıntı için " Yerel değişken ataması için tırnak gerekli mi? " Konusuna bakın .

Bourne sözdizimi olsa:

d=$a; export d

belirsizliği olmayan tüm kabukları tarafından aynı şekilde yorumlanır ( d=$a export dBourne kabuğunda ve POSIX uyumlu kabukları içinde de çalışır, ancak öykünme zsholmadıkça son sürümlerinde çalışmaz sh).

Bundan daha kötüye gidebilir. Örneğin ,bash dizilerin ne zaman dahil olduğu hakkındaki son tartışmaya bakın .

(IMO, bu özelliği tanıtmak bir hataydı ).


Her foo=bar export foozaman orada gördüğüm gibi , noktalı virgül gerekli olmadığına şaşırdım . İhracatın yerleşik olduğunu biliyorum ama neden foo=bar; foo=baz export foo; echo $foofarklı davranıyor foo=bar; foo=baz /bin/cat /dev/null; echo $foo?
jrw32982 Monica destekler

3
@ jrw32982, çünkü bir yerleşiktir. Sen hala modern POSIX kabuklarda ama olsun sadece özel yerleşikleriexport olduğunu.
Stéphane Chazelas

Her ne kadar tartışsa dadeclare olmasa da export, güvenliği önemseyen herkesin StéphaneChazelas'ın bash.bugs'a sağladığı bağlantıdaki tartışmayı okumasını öneririm .
John1024,

Mükemmel cevap! Ama elde etmek d=$a export dçok uzun sürdü , belirsizlik olmadan tüm mermiler tarafından aynı şekilde yorumlandı ;-)
conny

@conny, d=$a export dartık çalışmıyor zsh, bu yüzden yanıtı güncelleştirdim. Düzenlemeye bakınız.
Stéphane Chazelas

28

Bir faşizm değil, POSIX uyumlu bir sözdizimidir. Aslında çok uzun zaman önce bir kshism olarak başladı ve daha sonra neredeyse tüm Bourne sözdizimi tabanlı mermiler tarafından kabul edildi. Tek meşhur istisna, /bin/sheski Bourne kabuğu sözdizimine sadık kalan Solaris 10 ve daha ileri yaşlarda. Umarım, Solaris 11, POSIX uyumlu bir kabuk kullanır /bin/sh.

Bu arada, exporteski Bourne kabuğunda zaten yerleşik bir emirdi, o yüzden googling export: command not foundyanıltıcıydı.

İşte bir ilgi ile birleştirildiğinde eski Bourne kabuğu davranışı export:

$ export var=22
var=22: is not an identifier

Nostaljikler için, bu orijinal Bourne kabuğunun kaynak kodu mevcuttur ve çoğu Unix ve Linux dağıtımı için derlenebilir.


Tarihsel bilgiler ve google için doğru hata mesajı için çok teşekkürler! Buradan dönüp, allık ... belirgin
tripleee

4
Bu orijinal Bourne kabuğunun kaynak kodu değil, değiştirilmiş bir OpenSolaris sh. Bourne kabuğu, ancak on yıllarca süren bir evrim geçirdikten sonra. Unix V7 ile birlikte gönderilen orijinal Bourne kabuğu, Unix Heritage Society'de bulunabilir
Stéphane Chazelas

1
@ StéphaneChazelas Kesinlikle konuşursak, her zamanki gibi haklısın. Bununla birlikte, Solaris 10 tarafından kullanılan kabuğa ve modern platformlarda derlenebilecek kaynak koduna atıfta bulunduğum için "orijinal Bourne kabuğunu" değil, "bu orijinal Bourne kabuğunu" yazdığımı unutmayın. Ayrıca, Bourne kabuğunun 1977 ile 1989 arasında eklenmiş birçok özelliğe sahip olduğunu ancak son 25 yıl içerisinde (özellikle yeni platformlara ve hata düzeltmelerine uyum sağlama dışında) gelişmeye son verdiğini unutmayın.
jlliagre
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.