apt-get 後にスクリプトが停止しないようにするにはどうすればよいですか?

apt-get 後にスクリプトが停止しないようにするにはどうすればよいですか?

私はいくつかの bash スニペットを保存し、管理に必要なときにコピー & ペーストします。しかし、スクリプトの実行をキャンセルすることを発見しましたapt-get。問題のあるスクリプトは次のとおりです。

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

cd ~/
mkdir t1
cd t1

このスクリプトを OS X ターミナルから Ubuntu 12.04 LTS サーバー (VM に新規インストール) にコピー & 貼り付けると、スクリプトはapt-get終了後に常に停止します。

このコマンドはroot次のようなアカウントで実行します。

ssh user1@server

<password…>

sudo su

<password…>

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

cd ~/
mkdir t1
cd t1

これは問題になるのでしょうか? または、スクリプトがapt-get終了後に停止するのはなぜですか? また、スクリプトを続行するにはどうすればよいでしょうか?

答え1

私も同じ問題を抱えていましたが、ここでの解決策にはあまり満足できなかったか、解決策がうまく機能しませんでした。実行するために私が見つけたのは、apt-get に NULL 入力を送信して、引き続き動作させることです。

次のようになります:

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

cd ~/
mkdir t1
cd t1

#newline

他の人もこれを使えるといいですね!最後のコマンドも実行されるように改行を忘れないでください

答え2

まず、スクリプトを実行していません。一連のコマンドを貼り付けてもスクリプトにはなりません。Jobin の回答で説明されているように、実際にスクリプトを使用している場合はこの問題は発生しません。

問題は、おそらく、コマンドで入力バッファをオーバーロードし、入力バッファから読み取る次のプロセスが bash であることを期待していることです。apt-get が代わりに入力バッファから読み取る理由は多数あるため、終了すると何も残らず、bash に戻ります。

必要に応じて、スクリプト ファイルをコピーしたり書き込んだりして実行可能にする手間をかけずに、一連のコマンドを貼り付けることもできます (スクリプトの作成は多くの場合、労力の無駄になります。たとえば、複数のマシンで実行する必要があるが、同じマシンで 2 回実行する必要のない単純なコマンド セットなど)。

セミコロンで区切られた一連のコマンドを貼り付けると、シーケンス全体が bash に送られ、apt が入力バッファで何を行うかに関係なく続行されます。

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

答え3

ターミナル上のスクリプトのコマンドをコピーして貼り付けるのではなく、スクリプトをターミナル上で実行する必要があります。最初のアプローチの問題点は、最初のコマンドが末尾の改行とともに貼り付けられるとすぐに、apt-get の実行が開始され、ターミナルにさらにコマンドを貼り付けることができなくなり、実行されなくなることです。

スクリプトを実行するには、次のようにコマンドをファイルrun.sh(または任意の名前) に書き込みます。

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

cd ~/
mkdir t1
cd t1

そして、ターミナルで実行するには、bash run.shまたは と入力しbash filenameます (filename はスクリプトに付けた名前に置き換えます)。このスクリプトの最初の行は、スクリプトを直接実行する場合 (まず を使用して実行可能にするchmod +x filename)、次に としてスクリプトを実行する場合に使用するシェルを指定します/path/filename

答え4

apt-get正常にインストールされた場合でも、ゼロ以外のコードで終了することがあります。

そして、スクリプトが停止します。これは無意味かつ馬鹿げていますが、回避策が必要です。apt-get ブロックをサブスクリプトで囲み、終了コードが無視されるようにすることで、スクリプトを強制的に続行しようとしました。

set -e

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

cd ~/
mkdir t1
cd t1

実際、私は内部がbashゼロ以外のコードで終了し、外部のスクリプトがカスケードを終了すると予想していましたが、そうならず、実行が続行されました。

関連情報