Comment écrire une réponse «oui» pour l'installation de programmes?

113

Je travaille avec des instances Amazon Linux et j'ai quelques scripts pour remplir les données et installer tous les programmes avec lesquels je travaille, mais quelques programmes demandent:

Do you want to continue [Y/n]?

et suspendez l'installation. Je veux répondre automatiquement "Y" dans tous les cas, je suis juste maintenant sûr de savoir comment le faire.

user974887
la source
3
Le gestionnaire de packages peut avoir un indicateur --nopromptou que --noconfirmvous pouvez utiliser.
Blender

Réponses:

209

La commande «yes» fera écho à «y» (ou tout ce que vous lui demanderez) indéfiniment. Utilisez-le comme:

yes | command-that-asks-for-input

ou, si un «Y» majuscule est requis:

yes Y | command-that-asks-for-input
PT
la source
cela ne fonctionne qu'avec une commande prise en charge pour utiliser l'entrée de oui, n'est-ce pas? J'ai essayé avec un coup d'œil d'OpenStack et cela ne fonctionne pas, je pense qu'Expect est plus précis pour toutes les circonstances
HVNSweeting
1
//, Que faire si vous devez entrer le mot complet "oui"?
Nathan Basanese
1
Soyez prudent yescar il est connu de maximiser le processeur. stackoverflow.com/a/18164007/720665
David Salamon
Agréable. Cela m'a simplement rendu la vie beaucoup plus facile. :RÉ. Aussi googler -ypour les scripts bash était DIFFICILE.
Nathan Smith
1
@DavidSalamon ce n'est le cas que lorsqu'il écrit sur quelque chose sans limite, comme /dev/nullou STDOUT. Dirigé vers une commande, il n'écrira qu'une ligne dans le tube à chaque fois que la commande de réception en lit une, et attendra autrement.
Walf
68

echo y | command devrait marcher.

De plus, certains installateurs ont un indicateur "auto-yes". C'est -ypour apt-getUbuntu.

Dennis
la source
J'essaye de faire écho "giturl no" | registre jspm créer nom_registre jspm-git dans mon script shell. mais il échoue toujours. en entrant dans le giurl. Une idée?
manismku
Un autre exemple: dans docker-compose, il y a un drapeau -f( --force) qui fonctionne comme "auto-yes" pour les commandes qui suppriment quelque chose
lu
Comment "faire écho Y" de manière récursive au cas où l'invite demande une confirmation plus d'une fois?
Safak Ozkan
18

Il se peut que vous ne puissiez pas installer Expect sur le serveur cible. C'est souvent le cas quand on écrit, par exemple, un travail Jenkins.

Si tel est le cas, je considérerais quelque chose comme la réponse à ce qui suit sur askubuntu.com:

/ubuntu/338857/automatically-enter-input-in-command-line

printf 'y\nyes\nno\nmaybe\n' | ./script_that_needs_user_input

Notez que dans certains cas rares, la commande n'oblige pas l'utilisateur à appuyer sur Entrée après le caractère. dans ce cas, laissez les nouvelles lignes en dehors:

printf 'yyy' | ./script_that_needs_user_input

Par souci d'exhaustivité, vous pouvez également utiliser un document ici:

./script_that_needs_user_input << EOF
y
y
y
EOF

Ou si votre shell le prend en charge, une chaîne ici:

./script <<< "y
y
y
"

Ou vous pouvez créer un fichier avec une entrée par ligne:

./script < inputfile

Encore une fois, tout le mérite de cette réponse revient à l'auteur de la réponse sur askubuntu.com , lesmana.

Nathan Basanese
la source
//, Assurez-vous de voter pour l'utilisateur de askubuntu.com @lesmana si vous aimez cette réponse.
Nathan Basanese
6

Bien que cela puisse être plus compliqué / plus lourd que vous ne le souhaitez, une façon très flexible de le faire consiste à utiliser quelque chose comme Expect (ou l'un des dérivés dans un autre langage de programmation).

Expect est un langage conçu spécifiquement pour contrôler les applications basées sur du texte, ce que vous cherchez exactement à faire. Si vous finissez par avoir besoin de faire quelque chose de plus compliqué (comme avec la logique pour réellement décider quoi faire / répondre ensuite), Attendez-vous est la voie à suivre.

Adam Batkin
la source
6

Vous avez juste besoin de mettre -yavec la commande d'installation.

Par exemple: yum install <package_to_install> -y

Rohan Seth
la source
3

Si vous souhaitez simplement accepter les valeurs par défaut, vous pouvez utiliser:

\n | ./shell_being_run
Warhansen
la source
//, Comment cela signifie-t-il que vous accepteriez les valeurs par défaut?
Nathan Basanese
2
Dans bash, shet la plupart des systèmes, que je connais, vous devez echole \nsinon il ne serait pas redirigé vers la commande suivante.
2i3r