Passaggio di argomenti a un programma interattivo in modo non interattivo


115

Ho uno script bash che utilizza il readcomando per leggere gli argomenti ai comandi in modo interattivo, ad esempio le opzioni sì / no. C'è un modo per chiamare questo script in uno script non interattivo che passa i valori delle opzioni predefinite come argomenti?

Non è solo un'opzione che devo passare allo script interattivo.


2
Se sta leggendo da stdin potresti inserire il tuo input
lc.

4
Poiché questa domanda riceve molti duplicati, vale la pena sottolineare che non importa in quale lingua è scritto il programma interattivo. Potrebbe essere un programma C che legge lo standard input, o un'applicazione Erlang, o qualsiasi altra cosa. C'è qualcosa che viene eseguito dalla riga di comando e richiede odiosamente un input interattivo e vorresti automatizzarlo.
tripleee

Ovviamente, se hai il controllo sull'applicazione odiosa, riscrivila in modo che possa leggere le risposte in modo non interattivo (tramite un file di configurazione, opzioni della riga di comando o qualsiasi altra cosa). Questo è molto più affidabile e robusto contro la modifica dell'ordine o della formulazione delle domande interattive.
tripleee

Risposte:


46

Per attività più complesse c'è expect( http://en.wikipedia.org/wiki/Expect ). Fondamentalmente simula un utente, puoi codificare uno script su come reagire a specifici output del programma e cose correlate.

Questo funziona anche in casi come sshquello che vieta di inviare password ad esso.


8
... Anche se la soluzione corretta nel caso SSH è passare all'autenticazione con chiave pubblica.
tripleee

154

Molti modi

pipe il tuo input

echo "yes
no
maybe" | your_program

reindirizzare da un file

your_program < answers.txt

usa un here document (questo può essere molto leggibile)

your_program << ANSWERS
yes
no
maybe
ANSWERS

usa una stringa qui

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

5
È opportuno sottolineare che questo funziona solo se il programma legge lo standard input. Alcuni programmi fanno di tutto per leggere, ad esempio, le password in modo interattivo, anche quando lo standard input è una pipe. Per le password, questo ha senso per motivi di sicurezza; sebbene alcuni programmi interattivi siano semplicemente progettati male.
tripleee

@tripleee Sulla falsariga di quanto hai detto, come fa uno script a leggere le password che non sono influenzate dallo stdin? So che puoi usare readper afferrare stdin, quale funzione puoi usare per fare quello che hai descritto?
flow2k

In tal caso, è necessario vedere se il programma con cui si sta tentando di interagire ha un modo speciale per inviargli l'input (ad esempio sshpass, ssh-agent) o utilizzare si aspetta per scrivere l'interazione.
glenn jackman

2
Quello che fanno programmi come Expect è eseguire il client con una pseudo-tty dove sembra che ci sia un utente con un terminale e una tastiera all'altra estremità. Non puoi farlo con una pipa normale.
tripleee

Avviso IMPORTANTE. Questo non funziona se aggiungiamo spazi ai comandi forniti.
71GA

13

Puoi mettere i dati in un file e reindirizzarli in questo modo:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

Dati per lo script:

$ cat data.txt
2
3

Esecuzione dello script:

$ file.sh < data.txt
2
3

7

Voglio solo aggiungere un altro modo. L'ho trovato altrove ed è abbastanza semplice. Diciamo che voglio passare yes per tutti i prompt sulla riga di comando per un comando "execute_command", quindi semplicemente pipe sì ad esso.

yes | execute_command

Questo userà sì come risposta a tutte le richieste sì / no.


2

Puoi anche usare printf per reindirizzare l'input al tuo script.

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

Questo è ciò che mi ha salvato. Grazie @spanchan.
sk001

0

un'altra alternativa può essere

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

Il comando tee stampa l'input che riceve sullo schermo e allo stesso tempo lo salva in un file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.