例如
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
在您的情况下,我认为您希望第一种情况下,下一条命令的执行取决于上一条命令的成功。而是:
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
(该行末尾的反斜杠用于防止shell认为下一行是新命令;如果省略了反斜杠,则需要在一行中编写整个命令。)
将其保存到文件中,例如
myscript
,并使其可执行: /> 您现在可以执行脚本,就像计算机上的其他程序一样。但是,如果没有将其放置在
PATH
环境变量中列出的目录中(例如/usr/local/bin
或某些Linux发行版中的~/bin
),则需要指定该脚本的路径。如果它在当前目录中,请使用以下命令执行它:#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
脚本中的命令与第一个示例中的命令相同;下一条命令仅在上一条成功的情况下执行。要无条件执行所有命令,只需在每个命令的一行上列出它们即可:
chmod +x myscript
#2 楼
我发现使用;分隔命令仅在前台起作用。例如:cmd1; cmd2; cmd3 &
-仅在后台执行cmd3
,而cmd1 && cmd2 && cmd3 &
-如果没有错误,则将在后台执行整个链。 为了满足无条件执行的需要,使用括号可以解决以下问题:
(cmd1; cmd2; cmd3) &
-即使任何步骤失败,也会在后台执行命令链。评论
您的示例中的后跟&符号是否有意使用?如果是这样,它是做什么用的?
–技术爱好者
2015年11月19日在17:22
@Technophile运行后台命令
–橡木香托萨(Oak Chantosa)
16-4-7在17:54
一个简单,简短而直接的答案是,您应该更频繁地使用StackExchange网站Dean。感谢您的输入。
– CPHPython
16-10-4在13:22
#3 楼
您可以使用半冒号分隔命令:cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install
这是什么意思?
#4 楼
要一次运行它们,可以使用管道键“ |”像这样:$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install
评论
管道用于将命令的输出提供给下一个命令作为输入。例如:X | Y-> X命令输出将用作Y命令的输入
– Arpan Saini
18-10-17在3:57
#5 楼
如果要执行所有命令,无论前一个命令是否执行,都可以使用分号(;)分隔。cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
如果要执行仅在上一个命令成功执行后才执行下一个命令,然后可以使用&&分隔命令。
根据前面的命令,因此使用第二个示例,即使用&&联接命令。
#6 楼
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
评论
它与OP脚本不同,请说明:如果命令失败,则脚本中止
–吉尔斯·奎诺(Gilles Quenot)
2012年10月25日在21:06
另外,您可以使用cmd1 ||如果仅当cmd1向shell返回非零状态时才需要执行cmd2,则使用cmd2分隔符;并且可以使用cmd1;如果要运行两个命令,而无论它们的返回状态如何,都将使用cmd2。
– Victor Sorokin
2012年10月25日在21:08
@sputnick应该是,我只是将其粘贴并用&&串联了命令
–马克·史蒂文斯(Mark Stevens)
2012年10月25日在21:08
@MarkStevens这是一个更好的实现,但不会获得与顺序运行命令相同的结果,我认为这就是sputnick的意思。
– andrux
2012年10月25日在21:11
#7 楼
一台“&”号的作用是什么?今天早晨,我在XFCE面板(在Manjaro + XFCE中)中创建了一个启动器,以同时启动2个密码管理器:如我所愿。 IE,第一个应用程序启动,但第二个应用程序仅在前一个应用程序关闭时启动。
但是,我发现(只有一个&号): br />,现在就可以使用了...
评论
&符与;相似,它充当命令终止符,只不过这将comman放在后台,即shell看不到它的输出。
– Sergiy Kolodyazhnyy
18年5月27日在2:04
#8 楼
您可以用作以下代码;cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install
它可以工作...
#9 楼
对于此类问题,我发现很多答案都具有误导性从这篇文章修改: >以下代码将创建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();
}
评论
对于将来的读者:您也可以使用||如果您只希望在最后一个命令失败时执行下一个命令,则不要使用分号或&&。如尝试此操作,如果失败,请尝试。
– DeVadder
2014年5月7日14:55
嗯,分号并不总是有效。例如。 ls> / dev / null&;回声$!触发错误。
– Hi-Angel
2014年11月6日在8:52
如果我想在后台运行第一个命令,而在前景运行另一个命令,该怎么办呢。我正在尝试使用此尾部-f my.log&&& ./myscript,这不起作用..建议。
– OverrockSTAR
2015年6月4日在4:32
@Pareshkumar使用bash,您可以执行以下操作:{tail -f my.log&} && ./myscript但是,请注意&&在这里没有用,因为第一个作业在后台运行,因此第二个作业无法知道结果,因为两个作业将同时开始。因此,您最好只写:{tail -f my.log&}; ./myscript
– Nikos C.
2015年6月4日9:08
如果我需要sudo权限才能运行其中一个命令怎么办?我应该将sudo放在所有命令的开头还是仅在需要它的命令中?如何将密码传递给该命令以便正确执行?
–德鲁比奥
19年1月11日在18:01