J'exécute un script qui demande d'entrer 'y' sur chaque opération, je cherche une solution comme $ ./script < echo 'yyyyyyyyyyyyyy'
pour passer toutes mes entrées en une seule fois.
Meilleure réponse
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
. Ainsi, lorsque ./script
demande une entrée utilisateur, il obtiendra à la place 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 saisissait 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 yes
comme réponse. Voir ici par exemple :Ignorer l'invite oui/non dans "apt-get upgrade"
Autres méthodes pour saisir l'entrée :
Si vous savez exactement combien de y
votre script s'attend à ce que vous puissiez le faire comme ceci :
$ printf 'ynynyn' | ./script
Les retours à la ligne (n
) sont les touches d'entrée.
Utilisation de printf
au lieu de yes
vous avez un contrôle plus précis de l'entrée :
$ printf 'yesnnonmayben' | ./script
Notez que dans de rares cas, la commande n'exige pas que l'utilisateur appuie sur Entrée après le caractère. dans ce cas, laissez les sauts de ligne :
$ printf 'yyy' | ./script
Par souci d'exhaustivité, vous pouvez également utiliser un document ici :
$ ./script << EOF
y
y
y
EOF
Ou si votre shell le prend en charge, une chaîne here :
$ ./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 expect.
Voici un exemple de script d'attente super simple :
spawn ./script
expect "are you sure?"
send "yesr"
expect "are you really sure?"
send "YES!r"
expect eof
Point 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
En effet, 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 ./script
sera appelé avec l'argument 'yyyyyyyyyyyyyy'
et le stdin obtiendra l'entrée d'un fichier nommé echo
. Et bash se plaint puisque le fichier n'existe pas.