複数のLinuxコマンドを1行にマージして、デプロイメント操作を実行しようとしています。例えば
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
複数の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
;を使用していることがわかりました。コマンドを分離することは、フォアグラウンドでのみ機能します。例:
cmd1; cmd2; cmd3 &
cmd3
--はバックグラウンドで
のみ実行されますが、 cmd1 && cmd2 && cmd3 &
-エラーがない場合はバックグラウンドでチェーン全体が実行されます。
無条件の実行に対応するために、括弧を使用するとこれが解決されます。
(cmd1; cmd2; cmd3) &
-いずれかのステップが失敗した場合でも、コマンドのチェーンをバックグラウンドで実行します。
セミコロンを使用してコマンドを区切ることができます。
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
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
前のコマンドが成功した場合にのみ次のコマンドを実行する場合は、&&を使用してコマンドを区切ることができます。
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
あなたの場合、連続するコマンドの実行は前のコマンドに依存しているように見えるので、2番目の例を使用します。つまり、&&を使用してコマンドを結合します。
たった1つのアンパサンドの効用は何ですか?今朝、XFCEパネル(Manjaro + XFCE)でランチャーを作成して、2つのパスワードマネージャーを同時に起動しました。
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
しかし、それは私が望むようには機能しません。IE、最初のアプリは起動しますが、2番目のアプリは前のアプリが閉じられたときにのみ起動します
しかし、私はそれを見つけました(1アンパサンドのみ):
sh -c "keepassx & password-gorilla"
そしてそれは私が今望むように動作します...
;
$ cd myfolder; ls # no matter cd to myfolder successfully, run ls
&&
最初のコマンドcmd1が正常に実行された場合にのみ、2番目のコマンドcmd2を実行します。
$ cd myfolder && ls # run ls only after cd to myfolder
||
最初のコマンドcmd1の実行に失敗した場合にのみ、2番目のコマンドcmd2を実行します。
$ cd myfolder || ls # if failed cd to myfolder, `ls` will run
次のコードとして使用できます。
cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install
できます...
この種の質問に対する誤解を招く答えがたくさんあります
この投稿から変更: 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();
}
参考までに、if-elseで複数のコマンドを1行で実行する必要がある場合は、コマンドを括弧でグループ化できます。詳細については、このページを参照してください。
セミコロン(;)を&&または||に置き換えることができます 必要なものに応じて。括弧はコマンドを実行するためのサブシェルを作成することに注意してください。
次のコマンドは、 file_nameというファイルが存在する場合、cmd1、cmd2、およびcmd3コマンドを実行します。それ以外の場合は、cmd4、cmd5、およびcmd6です。
[ -f file_name ] && (cmd1; cmd2; cmd3) || (cmd4; cmd5; cmd6)