ZSH: O comando de leitura falha na função bash “leia: 1: -p: sem coprocess”

14

Editar:

Parece funcionar dentro de bash . Parece que o problema está relacionado a zsh . Se houver um site melhor para postar esse problema, me avise.

Estou escrevendo um script simples que cria uma série de diretórios. Eu quero que o usuário dê uma confirmação antes de fazer isso. Eu estou usando o seguinte como base, mas parece que não consigo executá-lo dentro de uma função bash. Se eu colocá-lo fora de uma função, isso funciona bem. Aqui está um exemplo isolado:

read.sh

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

código de this Então poste.

O fornecimento do arquivo e / ou test resulta no seguinte erro: read:1: -p: no coprocess . Mesma saída quando eu coloco no meu .bashrc

Editar: :

@hennes

  1. Eu quero que a função esteja em um arquivo de configuração, para que eu possa chamá-la de qualquer diretório (idealmente meu .bashrc ou .zshrc)
  2. Eu corrigi a formatação da primeira linha comentada. Problema ainda existe em zsh
  3. Versão Bash é 3.2, mas você me ajudou a descobrir que o problema é com zsh e não bash.
por Nick Tomlin 22.02.2013 / 17:59

2 respostas

27

A opção –p não significa o mesmo que o comando interno bash ' read ' e o comando interno zsh read. No comando zsh read , –p significa –– palpite –– “A entrada é lida no coprocess.” Sugiro que você exiba seu prompt com echo ou printf .

Você também pode precisar substituir –n 1 por –k ou –k 1 .

O zsh equivalente de bash read -p prompt é

read "?Here be dragons. Continue?"

Qualquer coisa depois de um ? no primeiro argumento é usado como a string de prompt.

E, claro, você pode especificar um nome de variável para ler (e esse pode ser um estilo melhor):

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

(Citando variáveis do shell é geralmente uma boa idéia também.)

    
por 22.02.2013 / 22:35
7

Este código parece fazer o que você quer em zsh.
(Note que a questão que você mencionou menciona explicitamente que é para o 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

Três comentários:

    
por 22.02.2013 / 22:52