いくつかの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
の終了後にスクリプトが停止する理由と、それを続行する方法
まず、スクリプトを実行していません。一連のコマンドを貼り付けても、スクリプトは作成されません。 Jobinの回答で説明されているように、実際にスクリプトを使用している場合、この問題は発生しません。
問題はおそらく、コマンドで入力バッファをオーバーロードし、bashが入力バッファから読み込む次のプロセスであることを望んでいることです。 apt-getが代わりに入力バッファーから読み取る理由はたくさんあるため、終了してbashに戻るときに何も残っていません。
必要に応じて、スクリプトファイルをコピーまたは作成して実行可能にするという手間をかけることなく、一連のコマンドを貼り付けることができます。 (多くの場合、スクリプトの作成は労力の無駄になります。たとえば、複数のマシンで実行する必要がある単純なコマンドセットであり、同じマシンで2回実行することはありません。)
セミコロンで区切られた一連のコマンドを貼り付けると、シーケンス全体がbashに送られ、aptが入力バッファーで何をするかに関係なく継続されます。
apt-get -y install gcc g++ make cmake Perl; cd ~/; mkdir t1; cd t1
私は同じ問題を抱えていましたが、ここでの解決策にあまり満足していなかったか、解決策がうまくいきませんでした。実行するために私が見つけたのは、apt-getにNULL入力を送信して、それが機能し続けるようにすることです。
次のようになります。
apt-get -y install gcc g++ make cmake Perl < "/dev/null"
cd ~/
mkdir t1
cd t1
#newline
他の人もこれを使用できることを願っています!最後のコマンドも実行されるように、改行を忘れないでください
ターミナルのスクリプトにコマンドをコピーして貼り付けるのではなく、スクリプトをターミナルで実行する必要があります。最初のアプローチの問題は、最初のコマンドが最後の改行と一緒に貼り付けられるとすぐに、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
としてスクリプトを実行する場合に使用するシェルを示します。
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
がゼロ以外のコードで終了することを予期していました。したがって、外部スクリプトはカスケードを終了しますが、終了せず、実行は継続しました。