Supongamos que tengo un archivo confirmation.sh
con el siguiente contenido:
#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
n|N) echo "smth"
;;
y|Y) echo "smth"
;;
esac
y quiero ejecutar este script de la siguiente manera:
cat confirmation.sh | sh
Ya veo Are you sure [Y/n]?
y el guión se interrumpe. ¿Cuál es el problema?
shell-script
shell
pipe
user-input
Igor Timoshenko
fuente
fuente
/bin/bash
en la línea de explosión, pero utiliza una.sh
extensión e intenta canalizar el scriptsh
. No es un problema ya que el código que tienes es compatible con ambos, pero vale la pena señalarlo.Respuestas:
Como otros han dicho, esto se debe a que el
stdin
desh
ha sido redirigido para leer desde la tubería, no está conectado al terminal como lo estaría normalmente. Una cosa que puede hacer para evitar esto es usar/dev/tty
para forzar la lectura del script desde la terminal. P.ej:Normalmente solo haría esto si específicamente desea evitar que las personas escriban la entrada, por ejemplo:
Esto aún se leería desde el terminal a pesar de que el usuario podría esperar que esto ingrese automáticamente
Y
en el indicador. Es común para los programas que esperan una contraseña para hacer esto.fuente
nota: gracias a @Graeme por corregirme en los dos ejemplos anteriores ...
Es mucho más fácil de hacer si te mantienes
stdin
alejado.O, dado que los 0 1 2 de un terminal son todos el mismo archivo, simplemente agregue:
Y tu
Funciona bien
fuente
stderr
. Aunque probablemente debería, no entiendo por qué.Esto ha funcionado para un solo argumento que se canaliza a mi script:
Entonces puedo acceder a los datos canalizados en un argumento posicional (
$1
), que es compatible con mis otros trabajos de script.De
info test
:fuente
La respuesta corta es que no puedes. La tubería redirige stdout a stdin, por lo que no puede ejecutar una secuencia de comandos interactiva, ya que ya ha redirigido la salida del primer comando como la entrada al segundo comando en la instrucción de tubería.
Quizás estés buscando hacer algo como esto:
fuente
sh confirmation.sh
?