2017-07-24 2 views
0

Je veux savoir comment nous pouvons fournir des entrées aux commandes qui changent. Je veux utiliser shell scriptEntrée dans l'invite de commande propriétaire dans le script shell

Exemple où « # » est toujours rapide et « > » est un spécifique rapide à mon programme:

mypc:/home/usr1# 
mypc:/home/usr1# myprogram 
myprompt> command1 
response1 
myprompt> command2 
response2 
myprompt> exit 
mypc:/home/usr1# 
mypc:/home/usr1# 
+0

Je suis désolé, la façon dont votre question est posée, je ne peux pas le comprendre complètement. Voulez-vous passer automatiquement 'command1' et' command2' à 'myprogram'? Pourriez-vous poster votre entrée/sortie attendue? – Aserre

+0

Oui, 'myprogram' est un exécutable 'C' qui aboutit à une nouvelle invite,' myprompt> '. Je dois envoyer des commandes dans cette nouvelle invite, dites write xxx. Je reçois une réponse 'xxx écrite' et le myprompt retourne jusqu'à ce que je tape exit. Après cela, je suis hors de myprogram et de retour à mon habituel "#" – Aadishri

Répondre

0

Si je comprends bien, vous voulez envoyer des commandes spécifiques à votre programme myprogram en séquence.

Pour ce faire, vous pouvez utiliser un simple script expect. Je suppose l'invite pour myprogram est noté avec myprompt>, et que le symbole myprompt> ne semble pas response1:

#!/usr/bin/expect -f 
#this is the process we monitor 
spawn ./myprogram 

#we wait until 'myprompt>' is displayed on screen 
expect "myprompt>" { 
    #when this appears, we send the following input (\r is the ENTER key press) 
    send "command1\r" 
} 

#we wait until the 1st command is executed and 'myprompt>' is displayed again 
expect "myprompt>" { 
    #same steps as before 
    send "command2\r" 
} 

#if we want to manually interract with our program, uncomment the following line. 
#otherwise, the program will terminate once 'command2' is executed 
#interact 

Pour lancer, invoquez simplement myscript.expect si le script est dans le même dossier que myprogram.

+0

Merci! Ma saveur linux n'a pas 'expect'. On dirait que je dois construire le paquet moi-même ... – Aadishri

0

Étant donné que myprogram est un script, il doit être invité à saisir quelque chose comme while read IT; do ...something with $IT ...;done. Difficile de dire exactement comment changer ce script sans le voir. echo -n 'myprompt> serait l'ajout le plus simple.

+0

myprogram est un exécutable 'C' – Aadishri

0

peut être fait avec PS3 et select construire

#!/bin/bash 

PS3='myprompt> ' 

select cmd in command1 command2 
do 
    case $REPLY in 
     command1) 
      echo response1 
      ;; 
     command2) 
      echo response2 
      ;; 
     exit) 
      break 
      ;; 
    esac 
done 

Ou avec echo et read builtins

prompt='myprompt> ' 
while [[ $cmd != exit ]]; do 
    echo -n "$prompt" 
    read cmd 
    echo ${cmd/#command/response} 
done 
+0

Je veux exécuter 'myprogram' aussi par script shell – Aadishri