¿Cómo evitar que el script no se detenga después de apt-get?

¿Cómo evitar que el script no se detenga después de apt-get?

Guardo algunos fragmentos de bash y los copio y pego cuando los necesito para la administración. Pero descubrí apt-getque cancela la ejecución del script. Aquí está mi guión donde era problemático.

apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

Copio y pego este script en la terminal OS X en el servidor Ubuntu 12.04 LTS (instalación nueva en VM). El script siempre se detiene una vez apt-getfinalizado.

Ejecuto este comando con rootuna cuenta como esta.

ssh user1@server

<password…>

sudo su

<password…>

apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

Puede ser esto un problema? ¿O por qué mi secuencia de comandos se detiene una vez apt-getfinalizada y cómo hacer para que continúe?

Respuesta1

Tuve el mismo problema pero no estaba muy contento con las soluciones aquí o las soluciones no me funcionaron. Lo que descubrí para que funcione es enviar una entrada NULL a apt-get, para que siga funcionando.

Se parece a esto:

apt-get -y install gcc g++ make cmake perl  < "/dev/null"

cd ~/
mkdir t1
cd t1

#newline

¡Espero que otras personas puedan usar esto también! No olvides la nueva línea para que también se ejecute el último comando.

Respuesta2

En primer lugar, no estás ejecutando un script. Pegar una serie de comandos no crea un script. Como se describe en la respuesta de Jobin, no tendría este problema si realmente estuviera usando un script.

El problema probablemente sea que esté sobrecargando el búfer de entrada con los comandos y esperando que bash sea el siguiente proceso en leer desde el búfer de entrada. Hay muchas razones por las que apt-get leería del búfer de entrada, por lo que no queda nada cuando finaliza y te devuelve a bash.

Si lo desea, aún puede pegar una serie de comandos sin tomarse la molestia de copiar o escribir un archivo de script y hacerlo ejecutable. (Crear el script sería una pérdida de esfuerzo en muchos casos, por ejemplo, un conjunto simple de comandos que debe ejecutar en varias máquinas y nunca dos veces en la misma máquina).

Si pega la serie de comandos separados por punto y coma, toda la secuencia se envía a bash y continuará independientemente de lo que apt haga con el búfer de entrada:

apt-get -y install gcc g++ make cmake perl; cd ~/; mkdir t1; cd t1

Respuesta3

No debería copiar y pegar los comandos del script en la terminal, el script debería ejecutarse en la terminal. El problema con el primer enfoque es que, tan pronto como se pega el primer comando junto con la nueva línea al final, apt-get comienza a ejecutarse, lo que evita que se peguen más comandos en la terminal, por lo que no se pegarán. ejecutando.

Para ejecutar un script, escriba los comandos en un archivo run.sh(o cualquier nombre que desee) de la siguiente manera:

#!/bin/bash
apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

y luego para ejecutarlo en una terminal, escriba bash run.sho bash filename(reemplace el nombre del archivo por el nombre que le ha dado al script). La primera línea de este script indica qué shell usar en caso de que ejecute el script directamente (primero haciéndolo ejecutable usando chmod +x filename) y luego ejecutando el script como /path/filename.

Respuesta4

apt-geta veces sale con un código distinto de cero incluso si se instaló correctamente.

Y eso hace que el guión se detenga. Esto es una tontería y es ridículo, pero tengo que solucionarlo. Intenté forzarlo a continuar envolviendo el bloque apt-get con un subíndice para que se ignorara el código de salida.

set -e

bash << +END
apt-get -y install gcc g++ make cmake perl
exit 0
+END
echo $?

cd ~/
mkdir t1
cd t1

En realidad, esperaba que el interior bashsaliera con un código distinto de cero, por lo que el script externo saldría de la cascada, pero no fue así y la ejecución continuó.

información relacionada