1. ホーム
  2. linux

[解決済み] 複数のLinuxコマンドを1行でまとめて実行する

2022-03-16 21:36:23

質問

複数のLinuxコマンドを1行にまとめ、デプロイメント操作を行おうとしています。 例えば、以下のような場合です。

cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install

解決方法は?

前のコマンドが成功したときだけ、それぞれのコマンドを実行したい場合は && 演算子を使用します。

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

1つのコマンドに失敗すると、それに続く他のコマンドはすべて実行されません。

前のコマンドが失敗したかどうかに関係なく、すべてのコマンドを実行したい場合は、セミコロンで区切ってください。

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install

あなたの場合、次のコマンドの実行が前のコマンドの成功に依存する、最初のケースを望んでいるのだと思います。

また、すべてのコマンドをスクリプトにまとめて、それを代わりに実行することも可能です。

#! /bin/sh

cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install

行末のバックスラッシュは、シェルが次の行を新しいコマンドと勘違いしないようにするためのもので、バックスラッシュを省略すると、コマンド全体を1行で書かなければならなくなります。

バックスラッシュと && は、コマンドのいずれかが失敗した場合にスクリプトを終了するようにシェルに指示します。そのためには set 組み込み関数で -e 引数で指定します。これを使えば、もっと自然な形でスクリプトを書くことができる。

#! /bin/sh
set -e

cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install

それをファイルに保存して、例えば myscript を作成し、実行可能な状態にします。

chmod +x myscript

これで、そのスクリプトをマシン上の他のプログラムと同様に実行できるようになりました。しかし、もしそのスクリプトを PATH 環境変数(例えば /usr/local/bin または、一部のLinuxディストリビューションでは ~/bin ) の場合、そのスクリプトへのパスを指定する必要があります。カレント・ディレクトリにある場合は、次のように実行します。

./myscript

スクリプト内のコマンドは、最初の例のコマンドと同じように動作します。次のコマンドは、前のコマンドが成功した場合にのみ実行されます。すべてのコマンドを無条件に実行するには、単に set -e :

#! /bin/sh

cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install