Bir betiği bash'a "okuma" ile pipetleme


10

Ben (doğrudan bash ile çalıştırmak yerine) bashile üzerinden boru ile bir komut dosyası wgetçalıştırmak gerekir.

$ wget -O - http://example.com/my-script.sh | bash

Çalışmıyor çünkü komut dosyamda readifadeler var. Bazı nedenlerden dolayı bash borulama yaparken bunlar çalışmaz:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

input:Bir değeri olması gerektiği gibi sormak ve sormak yerine , read komutu sadece iletilir bash.

Bilen var mı nasıl elimden boru olan bir komut dosyası readiçin bash?

Yanıtlar:


16

readstandart girişten okur. Ancak bash işleminin standart girdisi kod tarafından zaten alınır. Kabuğa bağlı olarak, readhiçbir şey okumaz çünkü kabuk tüm komut dosyasını okumuş ve ayrıştırmıştır veya readkodda öngörülemeyen satırlar tüketecektir.

Basit çözüm:

bash -c "$(wget -O - http://example.com/my-script.sh)"

Bu karmaşık senaryo için iyi bir çözüm göstermek yerine eğitim amaçlı daha karmaşık bir çözüm:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash

Harika teşekkürler. Bu neredeyse zarif.
Robin Winslow

2

İşlem ikamesi istediğinizi yapar:

bash <(wget ...)

Bununla birlikte, motivasyonunuzu burada sorgulamam gerekiyor. Web sunucusunu kontrol ederseniz (ve https kullanırsanız), bu belki mantıklı olabilir. Ancak sadece internet körlüğünden bir senaryo çalıştırmak çok risklidir.


just running a script from the internet blind is very risky- evet, riskli olduğunu biliyoruz, ancak insanlar belirli kuruluşların komut dosyalarına güvenmeyi seçebilir. @ Xen2050'nin cevabı hakkındaki yorumlarda tartışmaya bakın.
Robin Winslow

1

Şununla ilgili yanlış bir şey var mı:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?


çünkü o zaman bir dosya yaratmak zorundayım. Yani işe yarayacaktı, sadece biraz dağınık.
Robin Winslow

1
Doğru. Bu kullanım için iyi bir neden olsa da /tmp, birçok program geçici dosyaları kullanır. İndirilen herhangi bir komut dosyasını önce bir göz atmadan derhal çalıştırmayı
öğrenirim

Bu senin çağrın. Birçok proje bu tek astarları sunuyor, örneğin Docker , ohmyzsh ve şu anda hatırlayamadığım diğerleri. Bu durumda, kendi havuzumdan yeni sistemler üzerinde çalıştırmak istediğim bir kurulum betiği. Yazdığım gibi içeriği konusunda endişelenmiyorum.
Robin Winslow

3
Bu soruyu (belki de tamamen yeni bir kullanıcı) bulan başka hiç kimsenin daha iyi bilemeyeceğini düşünüyorum.
Xen2050
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.