回答:
前のコマンドが成功した場合にのみ各コマンドを実行する場合は、&&
演算子を使用してそれらを結合します。
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
ls >/dev/null & ; echo $!
、エラーが発生します。
tail -f my.log & && ./myscript
これは機能していません。
{ tail -f my.log & } && ./myscript
ただし、&&
最初のジョブはバックグラウンドで実行されるため、両方のジョブが同時に開始されるため、2番目のジョブは結果を認識できないため、ここでは役に立たないことに注意してください。あなたにもちょうど書くかもしれませんので、:{ tail -f my.log & }; ./myscript
sudo
コマンドの1つを実行する権限が必要な場合はどうなりますか?sudo
すべてのコマンドの最初に置くか、それを必要とするコマンドだけに置くべきですか?適切に実行されるように、そのコマンドにパスワードを渡すにはどうすればよいですか?
私はそれを使ってそれを見つけました; コマンドを分離することは、フォアグラウンドでのみ機能します。例:
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
あなたのケースでは、連続したコマンドの実行は前のコマンドに依存しているように見えるので、2番目の例を使用します。つまり、&&を使用してコマンドを結合します。
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
cmd1 || cmd2
必要cmd2
がある場合はセパレーターを使用でき、戻りステータスに関係なく両方のコマンドを実行cmd1
するcmd1 ; cmd2
場合に使用できます。
唯一のアンパサンドのユーティリティは何ですか?今朝、私はXFCEパネル(Manjaro + XFCE内)にランチャーを作成して、2つのパスワードマネージャーを同時に起動しました。
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
しかし、私が望むように機能しません。IE、最初のアプリは起動しますが、2番目のアプリは前のアプリが閉じたときにのみ起動します
しかし、私はそれを見つけました(アンパサンドは1つだけ):
sh -c "keepassx & password-gorilla"
そしてそれは今私が望むように機能します...
;
、バックグラウンドでコマンドの前にコマンドが置かれます。つまり、シェルは出力を表示しません。
私はこの種の質問に対する誤解を招く多くの答えを見つけます
この投稿からの変更: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();
}
||
セミコロンの代わりに使用することも&&
、最後のコマンドが失敗した場合にのみ次のコマンドを実行することもできます。これを試すように、そしてそれが失敗した場合は、それを試してください。