Bağımsız değişkenleri etkileşimli olmayan bir şekilde etkileşimli bir programa iletme


115

readEvet / hayır seçenekleri gibi, komutlara argümanları etkileşimli olarak okumak için komutu kullanan bir bash betiğim var . Varsayılan seçenek değerlerini bağımsız değişken olarak geçiren etkileşimli olmayan bir komut dosyasında bu komut dosyasını çağırmanın bir yolu var mı?

Etkileşimli komut dosyasına aktarmam gereken tek seçenek değil.


2
Eğer stdin'den okunuyorsa, girişinizde borulama yapabilirsiniz
lc.

4
Bu soru birçok kez tekrarlandığından, etkileşimli programın hangi dilde yazıldığının önemi olmadığını belirtmekte fayda var. Standart girişi okuyan bir C programı veya bir Erlang uygulaması veya her neyse olabilir. Komut satırından çalışan ve iğrenç bir şekilde etkileşimli girdi talep eden bir şey var ve bunu otomatikleştirmek istiyorsunuz.
üçlü

Elbette, iğrenç uygulama üzerinde kontrolünüz varsa, cevapları etkileşimli olmayan bir şekilde okuyabilmesi için yeniden yazın (bir yapılandırma dosyası, komut satırı seçenekleri veya her neyse). Bu, etkileşimli soruların sırasını veya kelimelerini değiştirmeye karşı çok daha güvenilir ve sağlamdır.
üçlü

Yanıtlar:


46

Daha karmaşık görevler için expect( http://en.wikipedia.org/wiki/Expect ) vardır. Temelde bir kullanıcıyı simüle eder, belirli program çıktılarına ve ilgili şeylere nasıl tepki verileceğini bir komut dosyası kodlayabilirsiniz.

Bu aynı zamanda sshborulama şifrelerini yasakladığı gibi durumlarda da işe yarar.


8
... SSH durumunda uygun çözüm, açık anahtar kimlik doğrulamasına geçmek olsa da.
üçlü

154

Çok şekilde

girişini yönlendir

echo "yes
no
maybe" | your_program

bir dosyadan yönlendirme

your_program < answers.txt

burada bir belge kullanın (bu çok okunabilir olabilir)

your_program << ANSWERS
yes
no
maybe
ANSWERS

Bir kullanmak Burada dize

your_program <<< $'yes\nno\nmaybe\n'

5
Bunun yalnızca program standart girdiyi okuduğunda çalıştığına dikkat çekiyor. Bazı programlar, standart giriş bir boru olsa bile, örneğin şifreleri etkileşimli olarak okuma yolundan çıkar. Şifreler için bu, güvenlik nedenleriyle anlamlıdır; bazı etkileşimli programlar sadece kötü tasarlanmış olsa da.
üçlü

@tripleee Söyledikleriniz doğrultusunda, bir betik stdin'den etkilenmeyen şifreleri nasıl okur? readStdin'i yakalamak için kullanabileceğinizi biliyorum , açıkladığınız şeyi yapmak için hangi işlevi kullanabilirsiniz?
flow2k

Bu durumda, etkileşime girmeye çalıştığınız programın girdiyi kendisine göndermek için özel bir yolu olup olmadığını (örneğin, sshpass, ssh-agent) veya etkileşimi komut dosyası olarak kullanıp kullanmadığını görmeniz gerekir.
glenn jackman

2
Expect gibi programlar, istemciyi, istemciye bir terminali ve diğer ucunda bir klavyesi olan bir kullanıcı varmış gibi göründüğü bir sözde tty altında çalıştırmaktır. Bunu normal bir pipo ile yapamazsınız.
üçlü

Önemli uyarı. Sağlanan komutlara boşluk eklersek bu işe yaramaz.
71GA

13

Verileri bir dosyaya koyabilir ve şu şekilde yeniden yönlendirebilirsiniz:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

Komut dosyası için veriler:

$ cat data.txt
2
3

Komut dosyasını yürütmek:

$ file.sh < data.txt
2
3

7

Bir yol daha eklemek istiyorum. Başka bir yerde buldum ve oldukça basit. "Execute_command" komutu için komut satırındaki tüm istemler için evet iletmek istediğimi varsayalım, O zaman basitçe ona evet gönderirdim.

yes | execute_command

Bu, tüm evet / hayır sorularına yanıt olarak evet'i kullanacaktır.


2

Ayrıca, girdiyi betiğinize yönlendirmek için printf kullanabilirsiniz.

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh

Bu beni kurtardı. Teşekkürler @spanchan.
sk001

0

başka bir alternatif olabilir

echo "something" | tee /path/to/file

Tee komutu aldığı girişi ekrana yazdırır ve aynı zamanda bir dosyaya kaydeder.

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.