Wie kann verhindert werden, dass das Skript nach apt-get nicht stoppt?

Wie kann verhindert werden, dass das Skript nach apt-get nicht stoppt?

Ich behalte einige Bash-Snippets und kopiere und füge sie ein, wenn ich sie zur Verwaltung brauche. Aber ich habe festgestellt, dass apt-getdie Skriptausführung abgebrochen wird. Hier ist mein Skript, wo es Probleme gab.

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

cd ~/
mkdir t1
cd t1

Ich kopiere und füge dieses Skript im OS X-Terminal auf dem Ubuntu 12.04 LTS-Server ein (Neuinstallation auf VM). Das Skript wird nach apt-getAbschluss immer gestoppt.

Ich führe diesen Befehl mit rooteinem Konto wie diesem aus.

ssh user1@server

<password…>

sudo su

<password…>

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

cd ~/
mkdir t1
cd t1

Kann das ein Problem sein? Oder warum stoppt mein Skript nach apt-getder Fertigstellung und wie kann ich es fortsetzen?

Antwort1

Ich hatte das gleiche Problem, war aber mit den Lösungen hier nicht sehr zufrieden oder die Lösungen haben bei mir nicht funktioniert. Ich habe herausgefunden, dass man es zum Laufen bekommt, indem man eine NULL-Eingabe an apt-get sendet, damit es weiterhin funktioniert.

Es sieht aus wie das:

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

cd ~/
mkdir t1
cd t1

#newline

Hoffe, dass andere Leute das auch nutzen können! Vergiss nicht die neue Zeile, damit der letzte Befehl auch ausgeführt wird

Antwort2

Zunächst einmal führen Sie kein Skript aus. Das Einfügen einer Reihe von Befehlen erstellt kein Skript. Wie in Jobins Antwort beschrieben, hätten Sie dieses Problem nicht, wenn Sie tatsächlich ein Skript verwenden würden.

Das Problem besteht wahrscheinlich darin, dass Sie den Eingabepuffer mit den Befehlen überladen und hoffen, dass Bash der nächste Prozess ist, der aus dem Eingabepuffer liest. Es gibt viele Gründe, warum apt-get stattdessen aus dem Eingabepuffer liest, sodass nichts übrig bleibt, wenn es fertig ist und Sie zu Bash zurückbringt.

Wenn Sie möchten, können Sie immer noch eine Reihe von Befehlen einfügen, ohne sich die Mühe machen zu müssen, eine Skriptdatei zu kopieren oder zu schreiben und ausführbar zu machen. (Das Erstellen des Skripts wäre in vielen Fällen Zeitverschwendung, beispielsweise bei einem einfachen Befehlssatz, den Sie auf mehreren Computern und nie zweimal auf demselben Computer ausführen müssen.)

Wenn Sie die durch Semikolon getrennte Befehlsreihe einfügen, wird die gesamte Sequenz an Bash übermittelt und unabhängig davon, was Apt mit dem Eingabepuffer macht, fortgesetzt:

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

Antwort3

Sie sollten die Befehle im Skript nicht auf dem Terminal kopieren und einfügen, das Skript sollte auf dem Terminal ausgeführt werden. Das Problem beim ersten Ansatz besteht darin, dass apt-get ausgeführt wird, sobald der erste Befehl zusammen mit der neuen Zeile am Ende eingefügt wird. Dadurch wird verhindert, dass weitere Befehle auf dem Terminal eingefügt werden, sodass sie nicht ausgeführt werden.

Um ein Skript auszuführen, schreiben Sie die Befehle run.shwie folgt in eine Datei (oder unter einem beliebigen Namen):

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

cd ~/
mkdir t1
cd t1

und um es dann auf einem Terminal auszuführen, geben Sie bash run.shoder ein bash filename(ersetzen Sie Dateiname durch den Namen, den Sie dem Skript gegeben haben). Die erste Zeile dieses Skripts gibt an, welche Shell verwendet werden soll, wenn Sie das Skript direkt ausführen (indem Sie es zuerst mit ausführbar machen chmod +x filename) und es dann als ausführen /path/filename.

Antwort4

apt-getwird manchmal mit einem von Null verschiedenen Code beendet, obwohl die Installation erfolgreich war.

Und das führt dazu, dass das Skript angehalten wird. Das ist Unsinn und lächerlich, aber ich muss das umgehen. Ich habe versucht, es zum Fortsetzen zu zwingen, indem ich den apt-get-Block mit einem Unterskript umschloss, sodass der Exit-Code ignoriert wurde.

set -e

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

cd ~/
mkdir t1
cd t1

Eigentlich hatte ich erwartet, dass das interne Skript bashmit einem Code ungleich Null beendet wird, sodass das externe Skript die Kaskade beenden würde. Dies geschah jedoch nicht und die Ausführung wurde fortgesetzt.

verwandte Informationen