Supposons que j'ai un fichier nommé confirmation.sh
avec le contenu suivant:
#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
n|N) echo "smth"
;;
y|Y) echo "smth"
;;
esac
et je veux exécuter ce script de la manière suivante:
cat confirmation.sh | sh
Je vois Are you sure [Y/n]?
et le script est interrompu. Quel est le problème?
shell-script
shell
pipe
user-input
Igor Timoshenko
la source
la source
/bin/bash
dans la ligne de coup, mais vous utilisez une.sh
extension et essayez de diriger le script verssh
. Ce n'est pas un problème car le code que vous avez est compatible avec les deux, mais mérite d'être souligné.Réponses:
Comme d'autres l'ont dit, c'est parce que le
stdin
ofsh
a été redirigé pour lire à partir du tuyau, il n'est pas connecté au terminal comme il le serait normalement. Une chose que vous pouvez faire pour contourner ce problème est d'utiliser/dev/tty
pour forcer le script à lire depuis le terminal. Par exemple:Normalement, vous ne feriez cela que si vous voulez spécifiquement empêcher les gens de créer un script pour l'entrée, par exemple:
Cela continuerait à être lu à partir du terminal même si l'utilisateur pouvait s'attendre à ce que cela soit automatiquement entré
Y
à l'invite. Il est courant pour les programmes qui attendent un mot de passe de le faire.la source
note: merci à @Graeme de m'avoir corrigé sur les deux exemples ci-dessus ...
C'est beaucoup plus facile à faire si vous restez à l'
stdin
écart.Ou, puisque les 0 1 2 d'un terminal sont tous le même fichier, ajoutez simplement:
Et ton
Fonctionne très bien.
la source
stderr
. Je devrais probablement cependant, je ne comprends pas pourquoi.Cela a fonctionné pour un seul argument dirigé vers mon script:
Je peux ensuite accéder aux données canalisées dans un argument positionnel (
$1
), qui est compatible avec mes autres fonctionnements de script.De
info test
:la source
La réponse courte est que vous ne pouvez pas. Le canal redirige stdout vers stdin, vous ne pouvez donc pas exécuter un script interactif, car vous avez déjà redirigé la sortie de la première commande comme entrée vers la seconde commande dans l'instruction pipe.
Vous cherchez peut-être à faire quelque chose comme ceci:
la source
sh confirmation.sh
?