Je suis en train d'exécuter un script qui demande d'entrer 'y' à chaque opération, je cherche une solution du type $ ./script < echo 'yyyyyyyyyyyyyy'
pour passer toutes mes entrées en une seule fois.
Réponses
Trop de publicités?Il existe une commande créée spécifiquement pour ce cas : yes
$ yes | ./script
Ce que cela fait est de connecter la sortie de yes
à l'entrée de ./script
. Alors quand ./script
demande l'entrée de l'utilisateur, il obtiendra à la place la sortie de yes
. La sortie de yes
est un flux sans fin de y
suivi d'un saut de ligne. Donc, en gros, c'est comme si l'utilisateur entrait y
pour chaque question de ./script
.
Si vous voulez dire non ( n
) au lieu de oui ( y
) vous pouvez le faire comme ceci :
$ yes n | ./script
Notez que certains outils ont une option pour toujours supposer que yes
comme réponse. Voir ici par exemple : Contourner l'invite oui/non dans 'apt-get upgrade'.
Autres méthodes pour saisir les données :
Si vous savez exactement combien y
votre script attend vous pouvez le faire comme ceci :
$ printf 'y\ny\ny\n' | ./script
Les nouvelles lignes ( \n
) sont les touches d'entrée.
Utilisation de printf
au lieu de yes
vous avez un contrôle plus fin de l'entrée :
$ printf 'yes\nno\nmaybe\n' | ./script
Notez que dans certains cas rares, la commande n'exige pas que l'utilisateur appuie sur la touche Entrée après le caractère. Dans ce cas, ne tenez pas compte des nouvelles lignes :
$ printf 'yyy' | ./script
Par souci d'exhaustivité, vous pouvez également utiliser un fichier ici le document :
$ ./script << EOF
y
y
y
EOF
Ou si votre Shell le supporte un ici la chaîne :
$ ./script <<< "y
y
y
"
Ou vous pouvez créer un fichier avec une entrée par ligne :
$ ./script < inputfile
Si la commande est suffisamment complexe et que les méthodes ci-dessus ne suffisent plus, vous pouvez utiliser s'attendre à .
Voici un exemple d'un expect script super simple :
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
Un petit détail technique :
L'invocation de la commande hypothétique que vous avez donnée dans votre question ne fonctionne pas :
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
C'est parce que la grammaire Shell permet un opérateur de redirection n'importe où dans la ligne de commande. En ce qui concerne le Shell, votre ligne de commande hypothétique est la même que cette ligne :
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
Cela signifie que ./script
sera appelé avec l'argument 'yyyyyyyyyyyyyy'
et le stdin sera alimenté par un fichier nommé echo
. Et bash se plaint car le fichier n'existe pas.
Certaines choses ( apt-get
par exemple) acceptent des drapeaux spéciaux pour fonctionner en mode silencieux (et acceptent les valeurs par défaut). Dans apt-get
Dans ce cas, il suffit de lui passer un -y
drapeau. Cela dépend complètement de votre script cependant.
Si vous avez besoin de choses plus compliquées, vous pouvez envelopper votre script dans un script expect. expect vous permet de lire la sortie et d'envoyer l'entrée de sorte que vous pouvez faire des choses assez compliquées que d'autres scripts ne permettraient pas. Voici un exemple un des exemples tirés de sa page Wikipedia :
# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof
Dans le Shell Shell, vous pouvez également utiliser l'astuce suivante de spawn, expect et send.
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
Cependant, dans le scénario ci-dessus, vous devrez donner la phrase que vous vous attendez à obtenir lorsque vous exécutez le script pour plus d'exemples, allez au lien suivant
Vous pouvez fournir une entrée utilisateur à votre script avec cat
à partir d'un fichier texte, envoyé à votre script avec bash
comme ça :
cat input.txt | bash your_script.sh
Il suffit de mettre les entrées utilisateur souhaitées dans votre fichier input.txt, les réponses que vous voulez - y, n, chiffres, chaînes de caractères, etc.
- Réponses précédentes
- Plus de réponses