我试图合并多个linux命令在一行中执行部署操作。 例如< / p >
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
在您的示例中,我认为您希望采用第一种情况,即下一个命令的执行取决于前一个命令的成功。
你也可以把所有的命令放在一个脚本中,然后执行:
#! /bin/sh cd /my_folder \ && rm *.jar \ && svn co path to repo \ && mvn compile package install
行尾的反斜杠是为了防止shell认为下一行是一个新命令;如果省略反斜杠,则需要将整个命令写在一行中。
与到处使用反斜杠和&&相比,更方便的方法是指示shell在任何命令失败时退出脚本。可以使用set内置函数和-e参数来实现。这样,你就可以用更自然的方式编写脚本:
set
-e
#! /bin/sh set -e cd /my_folder rm *.jar svn co path to repo mvn compile package install
将其保存到一个文件中,例如myscript,并使其可执行:
myscript
chmod +x myscript
现在可以像执行机器上的其他程序一样执行该脚本。但是如果你没有将它放在你的PATH环境变量中列出的目录中(例如/usr/local/bin,或者在一些Linux发行版中~/bin),那么你将需要指定该脚本的路径。如果它在当前目录中,你用:
PATH
/usr/local/bin
~/bin
./myscript
脚本中的命令与第一个示例中的命令工作方式相同;下一个命令只在前一个命令成功时执行。对于所有命令的无条件执行,只需不调用set -e:
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 & -如果没有错误,将在后台执行整个链。< / p >
cmd1; cmd2; cmd3 &
cmd3
cmd1 && cmd2 && cmd3 &
为了满足无条件执行,使用括号解决了这个问题:
(cmd1; cmd2; cmd3) & -将在后台执行命令链,即使任何步骤失败。
(cmd1; cmd2; cmd3) &
只有一个&号有什么用处? 今天早上,我在XFCE面板(Manjaro+XFCE)中创建了一个启动器,以同时启动2个密码管理器:
sh -c "keepassx && password-gorilla" or sh -c "keepassx; password-gorilla"
但它不像我想的那样工作。也就是说,第一个应用程序启动,但第二个应用程序只有在前一个应用程序关闭时才启动
然而,我发现(只有一个&号):
sh -c "keepassx & password-gorilla"
现在它就像我想要的那样…
您可以使用如下代码;
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
我发现这类问题的很多答案都具有误导性
从这篇文章修改: https://www.webmasterworld.com/linux/3613813.htm < / p >
下面的代码将创建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(); }
你可以根据需要将分号(;)替换为,,或||。请注意,括号创建了一个子shell来执行命令。
如果存在一个名为file_name的文件,下面的命令执行cmd1, cmd2和cmd3命令;否则为cmd4、cmd5、cmd6。
[ -f file_name ] && (cmd1; cmd2; cmd3) || (cmd4; cmd5; cmd6)
;
$ cd myfolder; ls # no matter cd to myfolder successfully, run ls
当第一个命令cmd1执行成功后,再执行第二个命令cmd2:
$ cd myfolder && ls # run ls only after cd to myfolder
||
当第一个命令cmd1执行失败时,执行第二个命令cmd2:
$ cd myfolder || ls # if failed cd to myfolder, `ls` will run