Éditer:
Semble fonctionner à l'intérieur bash
. Il semble que le problème soit lié à zsh
. S'il existe un meilleur site pour publier ce problème, faites le moi savoir.
J'écris un script simple qui crée une série de répertoires. Je veux que l'utilisateur donne une confirmation avant de le faire. J'utilise ce qui suit comme base, mais je n'arrive pas à le faire fonctionner dans une fonction bash. Si je le mets en dehors d'une fonction, cela 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 cette publication SO.
Sourcing le fichier et / ou les test
résultats de l'erreur suivante: read:1: -p: no coprocess
. Même sortie lorsque je la place dans mon.bashrc
Modifier ::
@hennes
- Je veux que la fonction soit dans un fichier de configuration, donc je peux l'appeler à partir de n'importe quel répertoire (idéalement mon .bashrc ou .zshrc)
- J'ai corrigé le formatage de la première ligne commentée. Le problème existe toujours dans
zsh
- La version Bash est 3.2, mais vous m'avez aidé à comprendre que le problème est avec zsh et non bash.
zsh
bash-scripting
Nick Tomlin
la source
la source
#! /bin/bash
avec un espace derrière elle shebang? Je pensais que ce n'était pas autorisé? 3) '#! / Usr / bin / env bash' est probablement mieux. 4) Quelle version bash? (J'ai testé avec bash 4.1.10 sur FreeBSD et je n'ai eu aucune erreur)zsh
mais je ne pensais pas qu'il y aurait un conflit avec les scripts bash (j'ai plusieurs autres scripts similaires en cours d'exécution). Je l'ai repensé et j'ai répondu à vos questions. Merci de m'avoir pointé dans la bonne direction!./read.sh
. Ce n'est pas nécessaire si vous l'exécutez d'une autre manière ou si vous le mettez dans un script de démarrage. Et si vous voulez l'exécuter en zsh avec `zsh ./read.sh ', alors les lignes commençant par un # seront ignorées. Ils confondent également car ils donnent l'impression que vous utilisez bash lorsque vous utilisez zsh).Réponses:
L'
–p
option ne signifie pas la même chosebash
estread
intégré et commandezsh
'sread
-commande intégrée. Danszsh
laread
commande de,–p
signifie –– devinez –– “L'entrée est lue à partir du coprocess.” Je vous suggère d'afficher votre invite avececho
ouprintf
.Vous devrez peut-être également remplacer
–n 1
par–k
ou–k 1
.L'
zsh
équivalent debash
l »read -p prompt
est -à-Tout ce qui se trouve après a
?
dans le premier argument est utilisé comme chaîne d'invite.Et bien sûr, vous pouvez spécifier un nom de variable dans lequel lire (et cela peut être un meilleur style):
(La citation de variables shell est généralement une bonne idée également.)
la source
Ce code semble faire ce que vous voulez dans zsh.
(Notez que la question à laquelle vous vous référez mentionne explicitement que c'est pour bash).
Trois commentaires:
la source
REPLY=""
pour effacer la variable REPLY. Sinon, si vous faites écho à $ REPLY, vous verrez qu'il est toujours défini jusqu'à ce que vous ouvriez ou fermiez votre terminal ou le réinitialisiez.Cette version vous permet d'avoir plus d'un cas
y
ouY
,n
ouN
Facultativement: répétez la question jusqu'à ce qu'une question d'approbation soit fournie
Facultativement: ignorer toute autre réponse
En option: quittez le terminal si vous le souhaitez
Remarquez cela aussi: sur la dernière ligne de cette fonction, effacez la variable REPLY. Sinon, si vous
echo $REPLY
le voyez, il est toujours réglé jusqu'à ce que vous ouvriez ou fermiez votre terminal ou le réinitialisiez.la source