347

複数のLinuxコマンドを1行にマージして、デプロイメント操作を実行しようとしています。例えば

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

11 に答える 11

754

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

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
于 2012-10-25T21:08:15.817 に答える
47

;を使用していることがわかりました。コマンドを分離することは、フォアグラウンドでのみ機能します。例:

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

無条件の実行に対応するために、括弧を使用するとこれが解決されます。

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

于 2013-07-15T04:37:13.403 に答える
10

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

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

それはあなたが意味することでしたか?

于 2012-10-25T21:06:16.623 に答える
4

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

$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install
于 2018-04-19T21:49:27.783 に答える
2
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
于 2012-10-25T21:05:32.397 に答える
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

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

于 2013-07-14T05:58:46.607 に答える
1

たった1つのアンパサンドの効用は何ですか?今朝、XFCEパネル(Manjaro + XFCE)でランチャーを作成して、2つのパスワードマネージャーを同時に起動しました。

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

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

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

sh -c "keepassx & password-gorilla"

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

于 2017-05-18T17:59:36.230 に答える
0
  1. 使用する;
  • 最初のコマンドcmd1が正常に実行されたかどうかに関係なく、常に2番目のコマンドcmd2を実行します。
    • $ cd myfolder; ls # no matter cd to myfolder successfully, run ls
  1. 使用する&&
  • 最初のコマンドcmd1が正常に実行された場合にのみ、2番目のコマンドcmd2を実行します。

    • $ cd myfolder && ls # run ls only after cd to myfolder
  1. 使用する||
  • 最初のコマンドcmd1の実行に失敗した場合にのみ、2番目のコマンドcmd2を実行します。

    • $ cd myfolder || ls # if failed cd to myfolder, `ls` will run
于 2021-09-28T17:08:00.137 に答える
-1

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

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

できます...

于 2018-04-10T13:33:54.657 に答える
-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();
            }
于 2018-08-28T18:33:45.607 に答える
-1

参考までに、if-elseで複数のコマンドを1行で実行する必要がある場合は、コマンドを括弧でグループ化できます。詳細については、このページを参照してください。

セミコロン(;)を&&または||に置き換えることができます 必要なものに応じて。括弧はコマンドを実行するためのサブシェルを作成することに注意してください。

次のコマンドは、 file_nameというファイルが存在する場合、cmd1、cmd2、およびcmd3コマンドを実行します。それ以外の場合は、cmd4、cmd5、およびcmd6です。

[ -f file_name ] && (cmd1; cmd2; cmd3) || (cmd4; cmd5; cmd6)
于 2021-03-17T03:25:37.480 に答える