Editar:
Parece trabalhar dentro bash
. Parece que o problema está relacionado zsh
. Se houver um site melhor para publicar esse problema, entre em contato.
Estou escrevendo um script simples que cria uma série de diretórios. Quero que o usuário confirme antes de fazê-lo. Estou usando o seguinte como base, mas não consigo executá-lo em uma função bash. Se eu colocá-lo fora de uma função, ele 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 desta postagem SO.
Abastecimento de arquivo e / ou test
resultados no seguinte erro: read:1: -p: no coprocess
. A mesma saída quando a coloco no meu.bashrc
Editar ::
@hennes
- 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)
- Corrigi a formatação da primeira linha comentada. O problema ainda existe em
zsh
- A versão do Bash é 3.2, mas você me ajudou a descobrir que o problema está no zsh e não no bash.
zsh
bash-scripting
Nick Tomlin
fonte
fonte
#! /bin/bash
com um espaço atrás dela shebang? Eu pensei que aqueles não eram permitidos? 3) '#! / Usr / bin / env bash' é provavelmente melhor. 4) Qual versão do bash? (Eu testei com o bash 4.1.10 no FreeBSD e não tem erros)zsh
mas não achei que houvesse conflito com os scripts do bash (eu tenho vários outros scripts semelhantes sendo executados corretamente). Marcamos novamente e respondi às suas perguntas. Obrigado por me apontar na direção certa!./read.sh
. Não é necessário executá-lo de qualquer outra maneira ou se você o colocar em um script de inicialização. E se você deseja executá-lo no zsh com `zsh ./read.sh ', as linhas que começam com # são ignoradas. Eles também confundem, pois dão a impressão de que você usa o bash quando usa o zsh).Respostas:
A
–p
opção não significa a mesma coisa parabash
'sread
built-in de comando ezsh
deread
comando integrado. Emzsh
'sread
comando,–p
meios - adivinhe - ‘A entrada é lida a partir do coprocess.’ Eu sugiro que você mostrar o seu tempo comecho
ouprintf
.Você também pode precisar substituir
–n 1
por–k
ou–k 1
.O
zsh
equivalente debash
'sread -p prompt
éQualquer coisa após a
?
no primeiro argumento é usada como a sequência de prompt.E é claro que você pode especificar um nome de variável para ler (e isso pode ser um estilo melhor):
(Citar variáveis do shell geralmente também é uma boa ideia.)
fonte
Esse código parece fazer o que você deseja no zsh.
(Observe que a pergunta a que você se refere explicitamente é para bash).
Três comentários:
fonte
REPLY=""
para limpar a variável REPLY. Caso contrário, se você repetir $ REPLY, verá que ele ainda está definido até você abrir ou fechar o terminal ou configurá-lo novamente.Esta versão permite que você tenha mais de um caso
y
ouY
,n
ouN
Opcionalmente: repita a pergunta até que uma pergunta de aprovação seja fornecida
Opcionalmente: ignore qualquer outra resposta
Opcionalmente: saia do terminal se desejar
Observe também: Na última linha desta função, limpe a variável REPLY. Caso contrário, se você
echo $REPLY
ver que ele ainda está definido até você abrir ou fechar o terminal ou configurá-lo novamente.fonte