Ya hay preguntas similares, pero estoy publicando esto porque ninguna de las respuestas funcionó. Estoy escribiendo un script de bash para automatizar la instalación de los paquetes pacman y AUR en mi sistema Arch. La idea es leer un archivo (myfile) con los nombres de los paquetes primera línea por línea y luego palabra por palabra y realizar la instalación de cada palabra. Esto funciona bien para pacman pero no para AUR Helper (aurman). La parte para aurman se ve así:
while read line; do
if [[ "$line" =~ \$[[:space:]]aurman[[:space:]]-S[[:space:]][[:alnum:]]* ]]
then
aurline=$(echo "$line" | awk '{ $1=""; $2=""; $3=""; print}' | sed 's/^ *//')
for aurpkg in $aurline
do
sudo -u "${my_user}" bash << EOF
aurman -S --noconfirm --needed --noedit "$aurpkg"
wait
EOF
done
fi
done < "$myfile"
Con las opciones --noconfirm - necesario --noedit aurman no me solicita Sí / No, pero para algunos paquetes me pide un número. Entonces, el problema es que en este caso el script no espera, el paquete no se instala y aurman produce un error "EOFError: EOF al leer una línea". He intentado pausar el script así:
aurman ...
wait
o así:
aurman ... &
wait
Pero ninguna de estas obras.
Entonces, ¿cómo puedo pausar mi script cuando aurman me pide un número? ¿Cuál es el enfoque general en casos como este? ¿Cómo puedo dar una respuesta para un paquete específico desde el principio cuando ejecuto el script (por ejemplo, 1 para el paquete x)?
aurman
pero tal vezexpect
Es la herramienta que necesitas. Verman 1 expect
y esta respuesta .Respuestas:
El problema básico es que stdin (que
aurman
está intentando leer desde) no proviene del usuario, se está redirigiendo primero desde$myfile
, y luego desde un documento aquí que contiene los comandos de shell parasudo
correr. Una opción es pasar esos archivos a través de un descriptor de archivo diferente, como el # 3 (que normalmente no se usa). yo pensar También puede simplificarlo eliminando el shell ejecutado bajosudo
- ya que estas corriendoaurman
en primer plano, no hay necesidad dewait
para ello, no necesita el shell (y, por lo tanto, no necesita el documento aquí).Si eso no funciona y realmente necesitas ejecutar el shell bajo
sudo
, también puede redirigirlo a través de FD # 3, y tenerbash
Lee eso como un guión, así:fuente
Para bash, hay la dormir comando, que pone el script en suspensión hasta que haya transcurrido un tiempo en segundos. Sin embargo, si lo que desea es capturar una contraseña, le recomendaría que prefiera uno de los dos métodos siguientes (verifique la secuencia de comandos que coloco en la parte inferior, para ilustrar cómo funciona el sueño, y también las 2 alternativas mencionadas a continuación).
fuente