执行在一行中组合多个linux命令

d-m*_*man 315 linux command-line

我试图在一行中合并多个linux命令来执行部署操作.例如

cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Run Code Online (Sandbox Code Playgroud)

Nik*_* C. 698

如果只想在前一个命令成功的情况下执行每个命令,则使用&&运算符组合它们:

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Run Code Online (Sandbox Code Playgroud)

如果其中一个命令失败,则不会执行其后的所有其他命令.

如果要执行所有命令而不管先前的命令是否失败,请用分号分隔它们:

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
Run Code Online (Sandbox Code Playgroud)

在你的情况下,我认为你想要第一种情况,即下一个命令的执行取决于前一个命令的成功.

您还可以将所有命令放在脚本中并执行该命令:

#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
Run Code Online (Sandbox Code Playgroud)

(行末尾的反斜杠用于防止shell认为下一行是新命令;如果省略反斜杠,则需要在一行中编写整个命令.)

例如myscript,将其保存到文件中,并使其可执行:

chmod +x myscript
Run Code Online (Sandbox Code Playgroud)

您现在可以像机器上的其他程序一样执行该脚本.但是,如果不将其放在PATH环境变量中列出的目录中(例如/usr/local/bin,或在某些Linux发行版上~/bin),则需要指定该脚本的路径.如果它在当前目录中,则使用以下命令执行:

./myscript
Run Code Online (Sandbox Code Playgroud)

脚本中的命令与第一个示例中的命令的工作方式相同; 如果前一个命令成功,则仅执行下一个命令.要无条件执行所有命令,只需在每行命令中列出:

#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Run Code Online (Sandbox Code Playgroud)

  • 对于未来的读者:如果你只想在最后一个命令失败时执行下一个命令,你也可以使用`||`代替分号或`&&`.在尝试这个时,如果它失败了,试试吧. (35认同)
  • @Pareshkumar使用bash,你可以这样做:`{tail -f my.log&} &&./ myscript`但是,请注意`&&`在这里没用,因为第一个作业在后台运行,因此第二个作业可以我不知道结果,因为两个工作都会同时开始.所以你不妨写一下:`{tail -f my.log&}; ./ myscript` (4认同)
  • 嗯,分号并不总是有效.例如`ls>/dev/null&; echo $!`触发错误. (3认同)
  • 如果我想在后台运行第一个命令并在前台运行另一个命令怎么办..我正在尝试这个不起作用的`tail -f my.log & && ./myscript`..请建议。 (2认同)

Dea*_*ean 44

我发现使用; 分离命令只能在前台工作.例如:

cmd1; cmd2; cmd3 & - 只会cmd3在后台执行,而 cmd1 && cmd2 && cmd3 &- 如果没有错误,将在后台执行整个链.

为了满足无条件执行,使用括号解决了这个问题:

(cmd1; cmd2; cmd3) & - 即使任何步骤失败,也会在后台执行命令链.

  • @Technophile运行[后台命令](http://unix.stackexchange.com/questions/103731/run-a-command-without-making-me-wait) (5认同)
  • 您的示例中的尾随符号 (&) 是故意的吗?如果是这样,它是做什么用的? (2认同)
  • 一个简单、简短且直接的答案是,您应该更频繁地使用 StackExchange 网站 Dean。感谢您的输入。 (2认同)

and*_*rux 10

您可以使用分号分隔命令:

cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install
Run Code Online (Sandbox Code Playgroud)

那是你的意思吗?