複数のLinuxコマンドを1行にまとめて実行する


329

複数のLinuxコマンドを1行にマージして、展開操作を実行しようとしています。例えば

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

回答:


717

前のコマンドが成功した場合にのみ各コマンドを実行する場合は、&&演算子を使用してそれらを結合します。

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行で記述する必要があります。)

それをファイルなどに保存して、myscript実行可能にします。

chmod +x myscript

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

./myscript

スクリプトのコマンドは、最初の例のコマンドと同じように機能します。次のコマンドは、前のコマンドが成功した場合にのみ実行されます。すべてのコマンドを無条件に実行するには、各コマンドを1行に1つずつリストします。

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

38
将来の読者のために:||セミコロンの代わりに使用することも&&、最後のコマンドが失敗した場合にのみ次のコマンドを実行することもできます。これを試すように、そしてそれが失敗した場合は、それを試してください。
DeVadder 2014年

3
セミコロンは常に機能するとは限りません。たとえばls >/dev/null & ; echo $!、エラーが発生します。
Hi-Angel

1
そして、最初のコマンドをバックグラウンドで実行し、別のコマンドをフォアグラウンドで実行したい場合はどうなりますか?tail -f my.log & && ./myscriptこれは機能していません。
OverrockSTAR 2015年

4
@Pareshkumar bashを使用すると、次のことができます。{ tail -f my.log & } && ./myscriptただし、&&最初のジョブはバックグラウンドで実行されるため、両方のジョブが同時に開始されるため、2番目のジョブは結果を認識できないため、ここでは役に立たないことに注意してください。あなたにもちょうど書くかもしれませんので、:{ tail -f my.log & }; ./myscript
ニコスC.

sudoコマンドの1つを実行する権限が必要な場合はどうなりますか?sudoすべてのコマンドの最初に置くか、それを必要とするコマンドだけに置くべきですか?適切に実行されるように、そのコマンドにパスワードを渡すにはどうすればよいですか?
Drubio

46

私はそれを使ってそれを見つけました; コマンドを分離することは、フォアグラウンドでのみ機能します。例:

cmd1; cmd2; cmd3 & - cmd3バックグラウンドでのみ実行されcmd1 && cmd2 && cmd3 &ますが、エラーがない場合は、チェーン全体がバックグラウンドで実行され ます。

無条件の実行に対応するには、括弧を使用してこれを解決します:

(cmd1; cmd2; cmd3) & -ステップが失敗した場合でも、一連のコマンドをバックグラウンドで実行します。


1
例の末尾のアンパサンド(&)は意図的なものでしたか?もしそうなら、それは何のためですか?
Technophile 2015年


1
シンプルで短く直接的な答えの1つは、StackExchange Webサイトをより頻繁に使用することです。ご入力いただきありがとうございます。
CPHPython

10

セミコロンを使用してコマンドを区切ることができます。

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

どういう意味ですか?


3

それらを一度に実行するには、パイプラインキー「|」を使用できます。そのようです:

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

1
パイプラインは、コマンドの出力を入力として次のコマンドに渡すために使用されています。例:X | Y-> Xコマンド出力はYコマンドの入力として機能します
Arpan Saini

2

前のコマンドを実行するかどうかに関係なく、すべてのコマンドを実行する場合は、セミコロン(;)を使用してコマンドを区切ることができます。

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

あなたのケースでは、連続したコマンドの実行は前のコマンドに依存しているように見えるので、2番目の例を使用します。つまり、&&を使用してコマンドを結合します。


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

OPスクリプトとは
異なり

4
さらに、ゼロ以外のステータスがシェルに返された場合にのみ実行するcmd1 || cmd2必要cmd2がある場合はセパレーターを使用でき、戻りステータスに関係なく両方のコマンドを実行cmd1するcmd1 ; cmd2場合に使用できます。
ビクターソロキン、

@sputnick必要があります。貼り付けて、&&でコマンドを連結しました
Mark Stevens

3
@MarkStevensこれはより良い実装ですが、コマンドが連続して実行された場合と同じ結果にはなりません。それがsputnickの意味だと思います。
andrux

1

唯一のアンパサンドのユーティリティは何ですか?今朝、私はXFCEパネル(Manjaro + XFCE内)にランチャーを作成して、2つのパスワードマネージャーを同時に起動しました。

sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"

しかし、私が望むように機能しません。IE、最初のアプリは起動しますが、2番目のアプリは前のアプリが閉じたときにのみ起動します

しかし、私はそれを見つけました(アンパサンドは1つだけ):

sh -c "keepassx & password-gorilla"

そしてそれは今私が望むように機能します...


1
アンパサンドはと同様のコマンドターミネータとして機能しますが;、バックグラウンドでコマンドの前にコマンドが置かれます。つまり、シェルは出力を表示しません。
Sergiy Kolodyazhnyy

-1

次のコードとして使用できます。

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

できます...


-1

私はこの種の質問に対する誤解を招く多くの答えを見つけます

この投稿からの変更:https : //www.webmasterworld.com/linux/3613813.htm

次のコードはbashウィンドウを作成し、bashウィンドウとまったく同じように機能します。お役に立てれば。そこにはあまりにも多くの間違った/機能しない答えがあります...

            Process proc;
            try {
                //create a bash window
                proc = Runtime.getRuntime().exec("/bin/bash");
                if (proc != null) {
                       BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                       PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
                       BufferedReader err = new BufferedReader(new InputStreamReader(
                       proc.getErrorStream()));
                       //input into the bash window
                       out.println("cd /my_folder");
                       out.println("rm *.jar");
                       out.println("svn co path to repo");
                       out.println("mvn compile package install");
                       out.println("exit");
                       String line;
                        System.out.println("----printing output-----");
                          while ((line = in.readLine()) != null) {
                             System.out.println(line);
                          }
                          while((line = err.readLine()) != null) {
                             //read errors
                          }
                          proc.waitFor();
                          in.close();
                          out.close();
                          err.close();
                          proc.destroy();
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.