es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la cual echo Step two... no se ejecuta después del comando apt-get es porque apt-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 comando apt-get para confirmar automáticamente cualquier pregunta, como esto:

    echo Paso uno...
    apt-get install -y --reinstall ca-certificates 
    echo Paso dos...
    

    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, incluyendo echo Paso dos....

    Alternativamente, puede utilizar un “heredoc” para proporcionar entrada a apt-get de esta manera:

    echo Paso uno...
    apt-get install -y --reinstall ca-certificates <<eof
    sí
    eof
    echo paso dos...
    

    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

    eof
    echo paso dos...

    esto permitirá que el script proporcione una respuesta “sí” a cualquier pregunta de apt-get.>

Comments are closed.