Eu mantenho alguns trechos do bash e os copio e colo quando preciso para 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
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-get
terminar.
Eu executo este comando com root
uma 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-get
terminar 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.sh
ou 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 bash
saí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.