私はいくつかの 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
ゼロ以外のコードで終了し、外部のスクリプトがカスケードを終了すると予想していましたが、そうならず、実行が続行されました。