58 votes

ZSH : La commande Read échoue dans la fonction bash "read:1 : -p : no coprocess".

Edita:

Il semble que cela fonctionne dans bash . Il semble que le problème soit lié à zsh . S'il existe un meilleur site où poster ce problème, faites-le moi savoir.


J'écris un simple script qui crée une série de répertoires. Je veux que l'utilisateur donne une confirmation avant que je le fasse. J'utilise ce qui suit comme base, mais je n'arrive pas à le faire fonctionner dans une fonction bash. Si je le place en dehors d'une fonction, il fonctionne bien. Voici un exemple isolé :

read.sh

#!/bin/bash
test() {
  read -p "Here be dragons. Continue?" -n 1 -r
  if [[ $REPLY =~ ^[Yy]$ ]]
  then
    echo "You asked for it..."
  fi
}

code de este SO post.

Approvisionnement du dossier et/ou test donne lieu à l'erreur suivante : read:1: -p: no coprocess . Même résultat lorsque je le place dans mon .bashrc

Edita: :

@hennes

  1. Je veux que la fonction soit dans un fichier de configuration, afin que je puisse l'appeler depuis n'importe quel répertoire (idéalement mon .bashrc ou .zshrc).
  2. J'ai corrigé le formatage de la première ligne commentée. Le problème existe toujours dans zsh
  3. La version de Bash est 3.2, mais vous m'avez aidé à comprendre que le problème vient de zsh et non de Bash.

95voto

Scott Points 20468

En –p ne signifie pas la même chose pour bash 's read commande intégrée et zsh 's read commande intégrée.  Dans zsh 's read commandement, –p signifie - je suppose - "L'entrée est lue à partir du coprocessus".  Je vous suggère d'afficher votre invite avec echo ou printf .

Vous devrez peut-être aussi remplacer –n 1 con –k ou –k 1 .


En zsh équivalent de bash 's read -p prompt es

read "?Here be dragons. Continue?"

Tout ce qui suit un ? dans le premier argument est utilisé comme chaîne d'invite.

Et bien sûr, vous pouvez spécifier un nom de variable à lire (et cela peut être un meilleur style) :

read "brave?Here be dragons. Continue?"
if [[ "$brave" =~ ^[Yy]$ ]]
then
    ...
fi

(Citer les variables Shell est généralement une bonne idée, aussi).

11voto

Hennes Points 63532

Ce code semble faire ce que vous voulez dans zsh.
(Notez que la question à laquelle vous faites référence mentionne explicitement que c'est pour bash).

#!/usr/bin/env zsh

test()
{
  echo -n "Here be dragons. Continue?"
  read REPLY

  if \[\[ $REPLY =~ ^\[Yy\]$ \]\]
  then
    echo "You asked for it..."
  fi
}

test

Trois commentaires :

2voto

jasonleonhard Points 189

Cette version vous permet d'avoir plus d'un cas. y ou Y , n ou N

  1. En option : Répéter la question jusqu'à ce qu'une question d'approbation soit fournie.

  2. En option : Ignorer toute autre réponse

  3. En option : Quittez le terminal si vous le souhaitez

    confirm() {
        echo -n "Continue? y or n? "
        read REPLY
        case $REPLY in
        [Yy]) echo 'yup y' ;; # you can change what you do here for instance
        [Nn]) echo 'nope n' ;;
        # Here are a few optional options to choose between
        # Any other answer:
    
        # 1. Repeat the question
        *) confirm ;;
    
        # 2. ignore
        # *) ;;
    
        # 3. Exit terminal
        # *) exit ;;
    
        esac
        # REPLY=''
    }

Remarquez aussi ceci : Sur la dernière ligne de cette fonction, effacez la variable REPLY. Sinon, si vous echo $REPLY vous verrez qu'il est toujours défini jusqu'à ce que vous ouvriez ou fermiez votre terminal ou le définissiez à nouveau.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X