web-dev-qa-db-fra.com

Comment empêcher le script de ne pas s'arrêter après apt-get?

Je conserve des extraits de bash et les copie/colle lorsque j'en ai besoin pour la gestion. Mais j'ai découvert que apt-get annule l'exécution du script. Voici mon script où problématique.

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

cd ~/
mkdir t1
cd t1

Je copie/colle ce script sur un terminal OS X sur un serveur Ubuntu 12.04 LTS (nouvelle installation sur une machine virtuelle). Le script s’arrête toujours après la fin de apt-get.

Je lance cette commande avec le compte root comme ceci.

ssh user1@server

<password…>

Sudo su

<password…>

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

cd ~/
mkdir t1
cd t1

Cela peut-il être un problème? Ou pourquoi mon script s’arrête après apt-get, et comment le faire continuer?

2
Eonil

Tout d'abord, vous n'exécutez pas de script. Coller une série de commandes ne crée pas de script. Comme décrit dans la réponse de Jobin, vous n'auriez pas ce problème si vous utilisiez réellement un script.

Le problème est probablement que vous surchargez le tampon d’entrée avec les commandes et que vous espérez que bash sera le prochain processus à lire à partir du tampon d’entrée. Il y a beaucoup de raisons pour lesquelles apt-get lirait à partir du tampon d'entrée, donc rien ne reste quand il finit et vous ramène à bash.

Si vous le souhaitez, vous pouvez toujours coller une série de commandes sans vous soucier de copier ou d'écrire un fichier de script et de le rendre exécutable. (La création du script serait une perte de temps dans de nombreux cas, par exemple un simple jeu de commandes que vous devez exécuter sur plusieurs machines et jamais deux fois sur la même machine.)

Si vous collez la série de commandes séparées par des points-virgules, la séquence entière est transmise à bash et continue indépendamment de ce que fait apt avec le tampon d'entrée:

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

3
Steven K

J'avais le même problème, mais je n'étais pas très satisfait des solutions proposées ou les solutions ne fonctionnaient pas pour moi. Ce que j'ai découvert pour le faire fonctionner, c'est envoyer une entrée NULL à apt-get, pour que cela continue à fonctionner.

Cela ressemble à ceci:

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

cd ~/
mkdir t1
cd t1

#newline

J'espère que d'autres personnes pourront l'utiliser aussi! N'oubliez pas la nouvelle ligne pour que la dernière commande soit également exécutée

8
syss

Vous ne devez pas copier-coller les commandes dans le script sur le terminal, le script doit être exécuté sur le terminal. Le problème avec la première approche est que, dès que la première commande est collée avec la nouvelle ligne à la fin de celle-ci, apt-get commence à s'exécuter, ce qui empêche de nouvelles commandes d'être collées sur le terminal, elles ne seront donc pas collées. l'exécution.

Pour exécuter un script, écrivez les commandes dans un fichier run.sh (ou le nom de votre choix) comme suit:

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

cd ~/
mkdir t1
cd t1

et ensuite pour l'exécuter sur un terminal, tapez bash run.sh ou bash filename (remplacez le nom de fichier par le nom que vous avez donné au script). La première ligne de ce script indique le shell à utiliser si vous l'exécutez directement (en le rendant d'abord exécutable avec chmod +x filename), puis en l'exécutant sous le nom /path/filename.

2
jobin

apt-get quitte parfois avec un code différent de zéro, même s'il a été installé avec succès.

Et cela fait que le script s'arrête. C'est absurde et ridicule, mais je dois contourner ce problème. J'ai essayé de le forcer à continuer en encapsulant apt-get block avec un sous-script afin que le code de sortie soit ignoré.

set -e

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

cd ~/
mkdir t1
cd t1

En fait, je m'attendais à ce que l'intérieur bash se termine avec un code différent de zéro - de sorte qu'un script extérieur se ferme en cascade - mais il ne le fait pas et l'exécution continue.

0
Eonil