Yanıtlar:
Her komutu yalnızca bir öncekinin başarılı olması durumunda yürütmek istiyorsanız, &&
operatörü kullanarak bunları birleştirin :
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Komutlardan biri başarısız olursa, onu izleyen diğer tüm komutlar yürütülmez.
Önceki komutların başarısız olup olmamasına bakılmaksızın tüm komutları yürütmek istiyorsanız, bunları noktalı virgülle ayırın:
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
Sizin durumunuzda, bir sonraki komutun yürütülmesinin bir öncekinin başarısına bağlı olduğu ilk vakayı istediğinizi düşünüyorum.
Ayrıca tüm komutları bir komut dosyasına yerleştirebilir ve bunun yerine yürütebilirsiniz:
#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
(Satırın sonundaki ters eğik çizgiler, kabuğun bir sonraki satırın yeni bir komut olduğunu düşünmesini önlemek için vardır; ters eğik çizgileri atlarsanız, tüm komutu tek bir satıra yazmanız gerekir.)
Örneğin myscript
, bunu bir dosyaya kaydedin ve yürütülebilir yapın:
chmod +x myscript
Artık bu komut dosyasını makinedeki diğer programlar gibi yürütebilirsiniz. Ancak bunu PATH
ortam değişkeninizde listelenen bir dizinin içine yerleştirmezseniz (örneğin /usr/local/bin
veya bazı Linux dağıtımlarında ~/bin
), o komut dosyasının yolunu belirtmeniz gerekir. Geçerli dizinde ise, aşağıdakilerle yürütürsünüz:
./myscript
Koddaki komutlar, ilk örnekteki komutlarla aynı şekilde çalışır; sonraki komut yalnızca bir öncekinin başarılı olması durumunda çalışır. Tüm komutların koşulsuz yürütülmesi için, her komutu kendi satırında listeleyin:
#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
ls >/dev/null & ; echo $!
bir hatayı tetikler.
tail -f my.log & && ./myscript
Çalışmayan bunu deniyorum .. lütfen öner.
{ tail -f my.log & } && ./myscript
Ancak, &&
ilk işin arka planda çalıştığı ve bu nedenle ikinci işin sonucunu bilemeyeceğinden, burada işe yaramaz olduğuna dikkat edin , çünkü her iki iş de aynı anda başlayacaktır. Yani sadece şunu da yazabilirsiniz:{ tail -f my.log & }; ./myscript
sudo
Komutlardan birini çalıştırmak için izinlere ihtiyacım olursa ne olur ? sudo
Tüm komutların başlangıcına mı yoksa sadece ihtiyacı olana mı koymalıyım ? Düzgün yürütülmesi için şifreyi bu komuta nasıl iletebilirim?
Bunu kullanarak buldum; komutları ayırmak için yalnızca ön planda çalışır. Örneğin :
cmd1; cmd2; cmd3 &
- yalnızca cmd3
arka planda
cmd1 && cmd2 && cmd3 &
yürütülürken - hata yoksa EĞER zincirin tamamını arka planda yürütür.
Koşulsuz yürütmeye hitap etmek için parantez kullanmak bunu çözer:
(cmd1; cmd2; cmd3) &
- herhangi bir adım başarısız olsa bile komut zincirini arka planda yürütür.
Hepsini birden çalıştırmak için "|" boru hattı anahtarını kullanabilirsiniz. şöyle:
$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install
Bir öncekinin yürütülüp yürütülmediğinden bağımsız olarak tüm komutları yürütmek istiyorsanız, komutları ayırmak için noktalı virgül (;) kullanabilirsiniz.
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
Bir sonraki komutu yalnızca önceki komut başarılı olduğunda yürütmek istiyorsanız, komutları ayırmak için && tuşlarını kullanabilirsiniz.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Sizin durumunuzda, ardışık komutların yürütülmesi önceki komutlara bağlı gibi görünüyor, bu nedenle ikinci örneği kullanın, yani komutlara katılmak için && kullanın.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
cmd1 || cmd2
ayırıcıyı cmd2
yalnızca cmd1
kabuğa sıfır dışında bir durum döndürüldüğünde yürütmeniz gerekiyorsa ve cmd1 ; cmd2
her iki komutu da dönüş durumlarından bağımsız olarak çalıştırmak istiyorsanız kullanabilirsiniz .
Sadece bir Ampersand'ın faydası nedir? Bu sabah, aynı anda 2 şifre yöneticisi başlatmak için XFCE panelinde (Manjaro + XFCE'de) bir başlatıcı yaptım:
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
Ama istediğim gibi çalışmıyor. IE, ilk uygulama başlar, ancak ikinci uygulama yalnızca önceki kapalı olduğunda başlar
Ancak, buldum (sadece bir ve işareti ile):
sh -c "keepassx & password-gorilla"
ve şimdi istediğim gibi çalışıyor ...
;
, ancak bunun arkayı komutanın arkasına koyması gerekir, yani kabuk çıktısını görmez.
Aşağıdaki kod olarak kullanabilirsiniz;
cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install
İşe yarıyor...
Bu tür bir soru için yanıltıcı bir sürü cevap buluyorum
Bu yayından değiştirildi: https://www.webmasterworld.com/linux/3613813.htm
Aşağıdaki kod bash penceresi oluşturur ve tam olarak bash penceresi olarak çalışır. Bu yardımcı olur umarım. Orada çok fazla yanlış / çalışmıyor cevap var ...
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();
}
||
Noktalı virgül yerine veya&&
yalnızca son komut başarısız olduğunda bir sonraki komutun yürütülmesini istiyorsanız da kullanabilirsiniz . Bunu deneyin ve başarısız olursa deneyin.