Ich behalte einige Bash-Snippets und kopiere und füge sie ein, wenn ich sie zur Verwaltung brauche. Aber ich habe festgestellt, dass apt-get
die 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-get
Abschluss immer gestoppt.
Ich führe diesen Befehl mit root
einem 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-get
der 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.sh
wie 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.sh
oder 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-get
wird 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 bash
mit 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.