web-dev-qa-db-ja.com

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の終了後にスクリプトが停止する理由と、それを続行する方法

2
Eonil

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

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

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

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

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

3
Steven K

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

次のようになります。

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

cd ~/
mkdir t1
cd t1

#newline

他の人もこれを使用できることを願っています!最後のコマンドも実行されるように、改行を忘れないでください

8
syss

ターミナルのスクリプトにコマンドをコピーして貼り付けるのではなく、スクリプトをターミナルで実行する必要があります。最初のアプローチの問題は、最初のコマンドが最後の改行と一緒に貼り付けられるとすぐに、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と入力します(スクリプトに指定した名前でファイル名を置き換えます)。このスクリプトの最初の行は、スクリプトを直接実行する場合(最初にchmod +x filenameを使用して実行可能にする)、次に/path/filenameとしてスクリプトを実行する場合に使用するシェルを示します。

2
jobin

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がゼロ以外のコードで終了することを予期していました。したがって、外部スクリプトはカスケードを終了しますが、終了せず、実行は継続しました。

0
Eonil