Como evitar que o script não pare após o apt-get?

Como evitar que o script não pare após o apt-get?

Eu mantenho alguns trechos do bash e os copio e colo quando preciso para gerenciamento. Mas descobri que apt-getcancela a execução do script. Aqui está meu script onde é problemático.

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

cd ~/
mkdir t1
cd t1

Copio e colo este script no OS X Terminal para o servidor Ubuntu 12.04 LTS (nova instalação na VM). O script sempre para após apt-getterminar.

Eu executo este comando com rootuma conta como esta.

ssh user1@server

<password…>

sudo su

<password…>

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

cd ~/
mkdir t1
cd t1

Isso pode ser um problema? Ou por que meu script para após apt-getterminar e como fazê-lo continuar?

Responder1

Tive o mesmo problema, mas não fiquei muito satisfeito com as soluções aqui ou as soluções não funcionaram para mim. O que descobri para fazê-lo funcionar foi enviar uma entrada NULL para o apt-get, para que continue funcionando.

Se parece com isso:

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

cd ~/
mkdir t1
cd t1

#newline

Espero que outras pessoas possam usar isso também! Não esqueça da nova linha para que o último comando também seja executado

Responder2

Primeiro, você não está executando um script. Colar uma série de comandos não cria um script. Conforme descrito na resposta de Jobin, você não teria esse problema se estivesse realmente usando um script.

O problema é provavelmente que você está sobrecarregando o buffer de entrada com os comandos e esperando que o bash seja o próximo processo a ser lido no buffer de entrada. Existem vários motivos pelos quais o apt-get leria o buffer de entrada, então nada resta quando ele termina e leva você de volta ao bash.

Se desejar, você ainda pode colar uma série de comandos sem se dar ao trabalho de copiar ou gravar um arquivo de script e torná-lo executável. (Criar o script seria um desperdício de esforço em muitos casos, por exemplo, um simples conjunto de comandos que você precisa executar em várias máquinas e nunca duas vezes na mesma máquina.)

Se você colar a série de comandos separados por ponto e vírgula, toda a sequência será alimentada no bash e continuará independentemente do que o apt fizer com o buffer de entrada:

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

Responder3

Você não deve copiar e colar os comandos do script no terminal, o script deve ser executado no terminal. O problema com a primeira abordagem é que, assim que o primeiro comando é colado junto com a nova linha no final dele, o apt-get começa a ser executado, o que evita que outros comandos sejam colados no terminal, para que não sejam executando.

Para executar um script, escreva os comandos em um arquivo run.sh(ou qualquer nome que desejar) da seguinte forma:

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

cd ~/
mkdir t1
cd t1

e então para executá-lo em um terminal, digite bash run.shou bash filename(substitua filename pelo nome que você deu ao script). A primeira linha deste script informa qual shell usar caso você execute o script diretamente (primeiro tornando-o executável usando chmod +x filename) e depois executando o script como /path/filename.

Responder4

apt-getàs vezes sai com código diferente de zero, mesmo que tenha sido instalado com sucesso.

E isso faz com que o script pare. Isso é um absurdo e ridículo, mas tenho que contornar isso. Tentei forçá-lo a continuar agrupando o bloco apt-get com subscript para que o código de saída fosse ignorado.

set -e

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

cd ~/
mkdir t1
cd t1

Na verdade, eu esperava que o interior bashsaísse com código diferente de zero - então o script externo sairia em cascata - mas isso não aconteceu e a execução continuou.

informação relacionada