web-dev-qa-db-fra.com

Quel est l'équivalent Linux de la pause DOS?

J'ai un script Bash Shell dans lequel je voudrais suspendre l'exécution jusqu'à ce que l'utilisateur appuie sur une touche. Sous DOS, cela s’accomplit facilement avec la commande "pause". Existe-t-il un équivalent Linux que je peux utiliser dans mon script?

212
jt.

read fait ceci:

user@Host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@Host:~$ 

Le -n1 spécifie qu'il n'attend qu'un seul caractère. Le -r le met en mode brut, ce qui est nécessaire car sinon, si vous appuyez sur une barre oblique inverse, il ne s'enregistre que lorsque vous appuyez sur la touche suivante. Le -p spécifie l'invite, qui doit être citée si elle contient des espaces. L'argument key n'est nécessaire que si vous voulez savoir sur quelle touche ils ont appuyé. Dans ce cas, vous pouvez y accéder via $key.

Si vous utilisez Bash, vous pouvez également spécifier un délai d'expiration avec -t, ce qui obligera read à renvoyer un échec lorsqu'une touche n'est pas enfoncée. Donc par exemple:

read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
    echo 'A key was pressed.'
else
    echo 'No key was pressed.'
fi
306
Jim

J'utilise beaucoup ces méthodes qui sont très courtes et ressemblent à des solutions @theunamedguy et @Jim, mais avec un délai d'expiration et un mode silencieux en plus.

J'aime particulièrement le dernier cas et l'utilise dans de nombreux scripts qui s'exécutent en boucle jusqu'à ce que l'utilisateur appuie sur Enter.

Les commandes

  • Entrez la solution

    read -rsp $'Press enter to continue...\n'
    
  • solution d'échappement (avec -d $ '\ e')

    read -rsp $'Press escape to continue...\n' -d $'\e'
    
  • Toute solution clé (avec -n 1)

    read -rsp $'Press any key to continue...\n' -n 1 key
    # echo $key
    
  • Question avec choix présélectionné (avec -ei $ 'Y')

    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
    
  • Solution de délai d'attente (avec -t 5)

    read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
    
  • alias amélioré de sommeil

    read -rst 0.5; timeout=$?
    # echo $timeout
    

Explication

- r spécifie le mode brut, qui n'autorise pas les caractères combinés tels que "\" ou "^".

- s spécifie le mode silencieux, et parce que nous n’avons pas besoin de la sortie clavier.

- p $ ' Invite ' spécifie l'invite, qui doit être comprise entre $ 'et' pour laisser des espaces et des caractères d'échappement . Attention, vous devez mettre entre guillemets simples avec le symbole en dollars pour profiter des caractères échappés, sinon vous pouvez utiliser des guillemets simples.

- d $ '\e ' spécifie escappe en tant que caractère délimiteur, de sorte qu'un dernier caractère pour l'entrée en cours est possible mettre n'importe quel caractère mais veillez à mettre un caractère que l'utilisateur peut taper.

- n 1 indique qu'il n'a besoin que d'un seul caractère.

- e spécifie le mode readline.

- i $ 'Y' spécifie Y comme texte initial en mode de lecture abrégée.

- t 5 spécifie un délai d'attente de 5 secondes

touche servir si vous avez besoin de connaître l'entrée, dans le cas -n1, la touche sur laquelle vous avez appuyé.

$? sert à connaître le code de sortie du dernier programme, en lecture, 142 en cas de dépassement du délai d'attente, 0 entrée correcte. Mettez $? dans une variable dès que possible si vous avez besoin de la tester après quelques commandes, car toutes les commandes réécriraient $?

146
y.petremann

Cela a fonctionné pour moi sur plusieurs versions de Linux, à l’inverse de certaines de ces solutions (y compris les plus populaires ici). Je pense que c'est plus lisible aussi ...

echo Press enter to continue; read dummy;

Notez qu'une variable doit être fournie comme argument de read.

13
BuvinJ

read sans paramètre ne continue que si vous appuyez sur entrée . La commande DOS pause continue si vous appuyez sur une touche quelconque. Utilisez read –n1 si vous souhaitez ce comportement.

12
xsl

read -n1 n'est pas portable. Une façon portable de faire la même chose pourrait être:

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

En plus d’utiliser read, il suffit de presser ENTER pour continuer. Vous pouvez faire ce qui suit:

sed -n q </dev/tty
8
mikeserv

Si vous avez juste besoin de mettre en pause une boucle ou un script et que vous êtes heureux d'appuyer sur Entrée au lieu de n'importe quelle touche, alors read seul fera l'affaire.

do_stuff
read
do_more_stuff

Ce n'est pas convivial pour l'utilisateur final, mais cela peut être suffisant dans les cas où vous écrivez un script rapide pour vous-même, et vous devez le suspendre pour faire quelque chose manuellement à l'arrière-plan.

2
mwfearnley

Essaye ça:

function pause(){
   read -p "$*"
}
1
Alex Fort

Cette fonction fonctionne à la fois avec bash et zsh et assure l’entrée/sortie du terminal:

# Prompt for a keypress to continue. Customise Prompt with $*
function pause {
  >/dev/tty printf '%s' "${*:-Press any key to continue... }"
  [[ $ZSH_VERSION ]] && read -krs  # Use -u0 to read from STDIN
  [[ $BASH_VERSION ]] && </dev/tty read -rsn1
  printf '\n'
}
export_function pause

Mettez-le dans votre .{ba,z}shrc pour Great Justice!

1
Tom Hale

Oui, à l'aide de read- et quelques modifications le rendent plus utile à la fois dans cronet dans le terminal.

Exemple:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

L'option -n 120 expire l'instruction de lecture après 2 minutes afin qu'elle ne se bloque pas dans cronname__.

En terminal, 2 minutes suffisent pour voir le temps d'exécution de la commande rsyncname__.

Ensuite, le nom suivant echoest défini de manière à ce que l'invite bash suivante apparaisse sur la ligne suivante.

Sinon, il apparaîtra sur la même ligne directement après "continue ..." quand Enter est enfoncé dans le terminal.

0
SDsolar