/ bin / sh kaynak stdin'den (diğer programdan) dosya değil


14

Buna isim vermek biraz zor ...

Temelde ben STDOUT kabuk değişkenleri kümesi üzerinde baskılar çalıştırırken bir program var:

$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".

Sanki STDOUT ile değerlendiriliyor gibi bir kabuk komut dosyası içinde çalıştırmak istiyorum source.

Gibi bir şey yapmak istiyorum ...

source `./settings`

... ama elbette bu işe yaramıyor.

Yapabileceğimi biliyorum:

./settings >/tmp/file
source /tmp/file

ama bunu gerçekten yapmak istemiyorum.

Herhangi bir ipucu var mı?

Yanıtlar:


16

Şunları kullanabilirsiniz eval:

eval "$(./settings)"

eval "`./settings`"

Üzgünüm, bahsetmeliydim, / bin / sh bash değil. $ () çalışmıyor. Soruyu güncelledim.
Majenko

@Matt: Pek çok sistemde sh bash'tır. Tabii ki son Ubuntu sürümlerini kastetmediniz, bunun yerine tire ile değiştirildi.
Merhaba71

@Matt: Bu durumda, ters tırnaklar çalışmalıdır. Ama tam sürümünü de eklemelisiniz sh- tire, kül, meşgul kutusu için bir sembolik olabilir ... Canlı "gerçek 'sh' 'nin bir kopyasını görmedim.
user1686

1
@Matt: Yani orada ... ilginç bir sistem var. Özellikle hemen hemen tüm "sh" varyasyonları $( )- 4.3BSD'de Almquist'in kabuğundan başlayarak - ve POSIX de desteklediğinden. (Not:
tartışmıyorum

$ () var, bu durumda böyle çalışmıyor. FreeBSD 8.2's / bin / sh
Majenko

15

/dev/fdMevcut olan sistemlerde , bash işlem ikamesini destekler:

source <(./settings)

Burada, çıkışının okunabileceği <( )otomatik olarak atanmış bir yola genişleyecektir ./dev/fd/..../settings


1
Bash el kitabında buna "işlem ikamesi" denir.
glenn jackman

6
declare `./settings`

Veya tabii ki ...

export `./settings`

Elbette test edin ...

export `echo -e "asdf=test\nqwerty=dvorak"` ; echo $asdf $qwerty

Boşluğun ele alınması:

eval export `./settings`

Aha, exporthile çalışıyor! Teşekkürler
Majenko

Şimdi - bir değerdeki boşlukları nasıl işleyebilirim?
Majenko

@Matt: Yorumlarda ters tırnak kullanamıyorum, bu yüzden lütfen düzenlenmiş cevaba bakın.
user1686

@grawity: Evet yapabilirsin ...a backtick --> ` <-- and here's another one --> ` <--
Hello71

2

source /dev/stdin < ./settings

Bence / dev / stdin bir Linux tek şey.


ayarların içeriğini bulmaya çalışır. './Settings' ile bile './settings' ile başarısız olur: Belirsiz ('= backtick)
Majenko

/dev/stdinBSD ve Cygwin üzerinde de çalışıyor.
user1686

1
Kullanılarak |, ancak, bir değil, borunun her iki taraf çok kaynaklı komutları geçerli kabuk etkilemeyeceği, ayrı alt prosesleri, çünkü, (en azından tam olarak) işe.
user1686

1
bunu yansıtacak şekilde düzenlendi.
LawrenceC

1
Bu /dev/stdinhileyi seviyorum , ama cevabınızın yaptığı aslında bir ovaya source ./settingsuygulamadan denk . Bunun üstesinden gelmek için burada bir belge kullanılabilir source /dev/stdin <<EOF \n $(./settings) \n EOF.
tlwhitec

0

Diğer cevaplar dosya oluşturduğu ve doğrudan stdin'den çekmediği için burada başka bir bakış açısı sağlamak istedim. Bazı hazırlanmış ortam bilgilerini birden çok komut dosyasına göndermek için gereken bazı yapılar var. Ne yapıyorum bir dizede Bash uyumlu değişken atamaları bir demet hazırlamaktır:

Var1="Foo"
Var2="Bar"
Var3="Baz"

Komut dosyasını yürütmeye hazırlanırken, yukarıdaki çok satırlı dizeyi base64 kodlar ve benim kabuk betiğime koyarım:

echo base64EncodedParameters | build.sh

Build.sh dosyasında stdin, base64 kodunu çözer ve sonucu değerlendiririm.

params=""
while read line; do params="${params}${line}"; done
eval `echo $params | base64 -D`

echo "Hello ${Var1} ${Var2}"
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.