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

2

Guardo alguns trechos do bash, copio-os e colo-os quando preciso de gerenciamento. Mas descobri que apt-get cancela 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

Eu copio & amp; cole este script no Terminal OS X para o servidor Ubuntu 12.04 LTS (nova instalação na VM) O script sempre para depois de apt-get terminar.

Eu executo este comando com root 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 depois de apt-get terminar e como fazer isso continuar?

    
por Eonil 08.11.2013 / 04:59

4 respostas

3

Primeiro, você não está executando um script. Colar uma série de comandos não faz um script. Como 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 a partir do buffer de entrada. Existem muitas razões para o apt-get ler o buffer de entrada, então nada é deixado quando ele termina e o leva de volta ao bash.

Se você quiser, ainda poderá colar uma série de comandos sem se preocupar em 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 conjunto simples de comandos que você precisa fazer 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 para bash e continuará independentemente do que o apt faz com o buffer de entrada:

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

    
por Steven K 09.11.2013 / 21:27
7

Eu tive o mesmo problema, mas não fiquei muito feliz com as soluções aqui ou as soluções não funcionaram para mim. O que eu descobri para executá-lo é enviar uma entrada NULL para o apt-get, para que continue a funcionar.

Parece assim:

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

cd ~/
mkdir t1
cd t1

#newline

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

    
por syss 29.08.2014 / 16:49
2

Você não deve copiar e colar os comandos no 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, o apt-get inicia a execução, o que impede que outros comandos sejam colados no terminal, então eles não serão executando.

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

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

cd ~/
mkdir t1
cd t1

e, em seguida, para executá-lo em um terminal, digite bash run.sh ou bash filename (substitua o nome do arquivo pelo nome que você forneceu ao script). A primeira linha deste script informa qual shell usar no caso de você executar diretamente o script (primeiro tornando-o executável usando chmod +x filename ) e, em seguida, executando o script como /path/filename .

    
por jobin 08.11.2013 / 05:12
0

apt-get às vezes sai com código diferente de zero mesmo que seja instalado com êxito.

E isso faz com que o script pare. Isso é um absurdo e ridículo, mas eu tenho que contornar isso. Eu tentei forçá-lo a continuar envolvendo o bloco apt-get com sub-script para que o código de saída seja 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 bash fosse sair com código diferente de zero - então o script externo sairia em cascata - mas isso não aconteceu e a execução continuou.

    
por Eonil 08.11.2013 / 05:50