Comando en un script de shell después de apt-get no se ejecuta correctamente cuando el script está en la entrada estándar del shell.
Tengo un script, simplificado a continuación:
echo Paso uno...
apt-get install -y --reinstall ca-certificates
echo Paso dos...
Para este caso de uso, no puedo ejecutarlo directamente, debe ser canalizado a bash, como se muestra a continuación:
cat script.sh | bash
El problema se muestra en la salida a continuación, donde cualquier cosa después del comando apt-get (a partir del segundo comando echo) no se ejecuta, sino que se muestra el comando echo en lugar de ejecutarse.
¿Cómo puedo hacer que esto funcione?
# cat uu | bash
Paso uno...
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 509 not upgraded.
Need to get 0 B/166 kB of archives.
After this operation, 0 B of additional disk space will be used.
Preconfiguring packages ...
echo Paso dos...
(Reading database ... 131615 files and directories currently installed.)
Preparing to unpack .../ca-certificates_20170717~14.04.2_all.deb ...
Unpacking ca-certificates (20170717~14.04.2) over (20170717~14.04.2) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Setting up ca-certificates (20170717~14.04.2) ...
Processing triggers for ca-certificates (20170717~14.04.2) ...
Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
Observe cómo se muestra echo Paso dos...
en la salida mientras que apt-get
aún se está ejecutando, no se ejecuta como un comando después de que termine.
davy.ai
La razón por la cual
echo Step two...
no se ejecuta después del comandoapt-get
es porqueapt-get
requiere entrada del usuario, lo cual no puede ser proporcionado mediante una tubería. En este caso,apt-get
está esperando la confirmación para continuar con la instalación, pero como está siendo enrutado, no puede recibir ninguna entrada y se queda ahí colgado.Para hacer que esto funcione, puede incluir la bandera
-y
en el comandoapt-get
para confirmar automáticamente cualquier pregunta, como esto:Con la bandera
-y
,apt-get
no solicitará la confirmación del usuario y continuará con la instalación. Esto permitirá que el script ejecute todos los comandos, incluyendoecho Paso dos...
.Alternativamente, puede utilizar un “heredoc” para proporcionar entrada a
apt-get
de esta manera:esto permitirá que el script proporcione una respuesta “sí” a cualquier pregunta de
apt-get
. sí=”” eof=”” echo=”” paso=”” dos…=””="" esto="" permitirá="" que="" el="" script="" proporcione="" una="" respuesta="" "sí"="" a="" cualquier="" pregunta="" de=""></eof
sí
eof
echo paso dos...
esto permitirá que el script proporcione una respuesta “sí” a cualquier pregunta de
apt-get
.>