GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Saisir automatiquement l'entrée dans la ligne de commande ?

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.

Connexes :Comment déboguer la suspension dans Ubuntu ?
Ubuntu
  1. Comment Linux gère-t-il plusieurs séparateurs de chemins consécutifs (/home////nom d'utilisateur///fichier) ?

  2. Accès au Presse-papiers en ligne de commande ?

  3. Que fait la ligne '!/bin/sh -e' ?

  4. ./configure :/bin/sh^M :mauvais interpréteur

  5. matlab exécute le script à partir de la ligne de commande linux

Trouver l'emplacement géographique du serveur Ubuntu via la ligne de commande

Lecteurs audio en ligne de commande ?

Trouver la ligne de commande ?

Options de ligne de commande Thunar ?

Quand dois-je utiliser /dev/shm/ et quand dois-je utiliser /tmp/?

l'utilisation de < /dev/null &dans la ligne de commande