Entrer automatiquement l'entrée dans la ligne de commande

93

J'exécute un script qui demande d'entrer "y" à chaque opération, je cherche une solution comme $ ./script < echo 'yyyyyyyyyyyyyy' pour transmettre toutes mes entrées en une seule fois.

    
posée NewMrd 29.08.2013 - 14:05
la source

7 réponses

180

Il existe une commande créée spécifiquement pour ce cas: yes

$ yes | ./script

Cela connecte l'entrée de ./script à la sortie de yes . Ainsi, lorsque ./script demande une entrée utilisateur, il obtiendra la sortie de yes . La sortie de yes est un flux sans fin de y suivi d'une nouvelle ligne. Donc, fondamentalement, comme si l'utilisateur entre 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 offrent une option pour ne pas demander et toujours asume yes comme réponse. Voir par exemple: Ignorer l'invite yes / no dans 'apt -get upgrade '

Autres méthodes pour saisir des entrées:

Si vous savez exactement combien y votre script s'attend à pouvoir le faire comme ceci:

$ printf 'y\ny\ny\n' | ./script

Les nouvelles lignes ( \n ) sont les touches d’entrée.

En utilisant printf au lieu de yes , vous avez un contrôle plus fin des entrées:

$ printf 'yes\nno\nmaybe\n' | ./script

Notez que dans certains cas rares, la commande n’exige pas que l’utilisateur appuie sur Entrée après le caractère. dans ce cas, laissez les nouvelles lignes:

$ printf 'yyy' | ./script

Pour être complet, vous pouvez également utiliser un document ici :

$ ./script << EOF
y
y
y
EOF

Ou si votre shell le supporte un chaîne ici :

$ ./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 attendre .

Voici un exemple de script d’attente super simple:

spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof

Point culminant technique:

L’invocation de commande hypothétique que vous avez donnée dans votre question ne fonctionne pas:

$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory

Ceci est dû au fait que la grammaire du shell autorise 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 que stdin obtiendra les entrées d'un fichier nommé echo . Et bash se plaint car le fichier n'existe pas.

    
réponse donnée lesmana 29.08.2013 - 14:08
la source
6

Certaines choses ( apt-get par exemple) acceptent des indicateurs spéciaux pour s'exécuter en mode silencieux (et acceptent les paramètres par défaut). Dans le cas de apt-get , vous passez simplement un indicateur -y . 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 attendu. attendre vous permet de lire la sortie et d'envoyer des entrées afin que vous puissiez faire des choses assez complexes que d'autres scripts ne permettraient pas. Voici un un des exemples 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
    
réponse donnée Oli 29.08.2013 - 14:12
la source
5

Dans le script shell, vous pouvez également utiliser l'astuce de spawn suivante, attendez et envoyez

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 attendez pendant que vous exécutez le script pour plus d'exemples. Allez sur le lien suivant

Attendez-vous à Bash

    
réponse donnée Tarun 29.08.2013 - 14:35
la source
5

Utilisez la commande yes :

yes | script

Extrait de la page de manuel:

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or 'y'.
    
réponse donnée Peter W. Osel 11.04.2014 - 16:40
la source
1

Ok, ce n’est peut-être pas une solution très élégante, mais si vous écrivez vos options dans un fichier distinct et que vous le transmettez ensuite en entrée du script, cela fonctionnera également. Donc, si vous créez un nouveau fichier avec toutes vos options (appelez ce fichier comme 'options.in'), vous pouvez facilement exécuter votre script avec ./script.sh < options.in et éditer / créer différents fichiers d'options selon vos besoins.

    
réponse donnée Sidhha 29.08.2013 - 17:50
la source
0

J'écrivais un script bash avec Dialog et il fallait que cela se fasse aussi automatiquement. Je l'ai fait et cela a fonctionné comme un charme.

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
    
réponse donnée Benjamin G. West 03.08.2017 - 18:05
la source
-3

Vous pouvez fournir une entrée utilisateur à votre script avec cat , à partir d'un fichier texte, redirigé vers votre script avec bash comme ceci:

cat input.txt | bash your_script.sh

Il suffit de mettre l’entrée utilisateur de votre choix dans votre fichier input.txt, quelles que soient les réponses souhaitées - y, n, chiffres, chaînes, etc.

    
réponse donnée WebComer 05.07.2018 - 11:46
la source

Lire d'autres questions sur les étiquettes