[英]Execute combine multiple Linux commands in one line
我试图在一行中合并多个 linux 命令来执行部署操作。 例如
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 认为下一行是新命令;如果省略反斜杠,则需要将整个命令写在一行中。)
将其保存到一个文件中,例如myscript
,并使其可执行:
chmod +x myscript
您现在可以像机器上的其他程序一样执行该脚本。 但是,如果您没有将它放在PATH
环境变量中列出的目录中(例如/usr/local/bin
,或在某些 Linux 发行版上~/bin
),那么您将需要指定该脚本的路径。 如果它在当前目录中,则使用以下命令执行它:
./myscript
脚本中的命令与第一个示例中的命令的工作方式相同; 仅当前一个命令成功时,才会执行下一个命令。 对于无条件执行所有命令,只需在其自己的行中列出每个命令:
#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
我发现使用 ; 分隔命令仅适用于前台。 例如:
cmd1; cmd2; cmd3 &
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
只有一个与号有什么用? 今天早上,我在 XFCE 面板(在 Manjaro+XFCE)中做了一个启动器来同时启动 2 个密码管理器:
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
但它不像我想要的那样工作。 IE,第一个应用程序启动,但第二个应用程序仅在前一个应用程序关闭时启动
但是,我发现(只有一个&符号):
sh -c "keepassx & password-gorilla"
它现在可以像我想要的那样工作......
;
$ 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
您可以使用以下代码;
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 中的一行中运行多个命令,您可以用括号将这些命令分组。 有关更多详细信息,请参阅此页面。
您可以将分号 ( ; ) 替换为&&或|| 取决于你需要什么。 请注意,括号会创建一个子 shell 来执行命令。
如果存在名为file_name的文件,则以下命令执行 cmd1、cmd2 和 cmd3 命令; 否则,cmd4、cmd5 和 cmd6。
[ -f file_name ] && (cmd1; cmd2; cmd3) || (cmd4; cmd5; cmd6)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.