In zsh, running the command read -p 'erasing all directories (y/n) ?' ans, throws the error,

read: -p: no coprocess

But in bash, it prints a prompt. How do I do this in zsh?


You can still use read, you just need to print a prompt first. In zsh, -p indicates that input should be read from a coprocess instead of indicating the prompt to use.

You can do the following instead, which is POSIX-compliant:

printf '%s ' 'erase all directories? (y/n)'
read ans

or a more zsh-like way

() {
  local compcontext='yn:yes or no:(y n)'
  vared -cp 'erasing all directories (y/n) ? ' ans

Which allows completing the answer.


Same as in ksh:

read 'ans?erasing all directories (y/n) ?'

Also note that zsh's read has the -q for yes/no answers:

if read -q '?erasing all directories (y/n) ?'; then
  rm -rf -- *(D/)

It returns true if your enter yes and doesn't require you to press Enter.

  • 2
    It should be noted that -q will not output a trailing newline after the user's reply. You need to do that yourself if you want one. – Kevin May 12 '16 at 20:18
  • Thanks for mentioning read -q. Exactly what I need. – Casimir May 25 '20 at 18:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy