Linux中单行上的多个命令

时间:2016-03-17 16:00:38

标签: linux command-line

我想在命令行上运行几个命令。

在正常情况下,这很简单:

#cd /home && ls && echo "OK"
root   web   support
OK

但是当其中一个命令在&上结束时,这似乎不起作用:

#killall vsftpd && /usr/sbin/vsftpd & && echo "OK"
-sh: syntax error: unexpected "&&"
OK

我尝试过没有单个尾随&,但这显然会停止后者echo的处理。只是为了好玩,尝试了三&但这也会返回错误。

所以我的问题;怎么才能得到

killall vsftpd
/usr/sbin/vsftpd &
echo "OK"

在一条线上执行?

2 个答案:

答案 0 :(得分:6)

首先,如果您想在一行中运行多个命令,请用;分隔:

cmd1 ; cmd2 ; cmd3

&&是逻辑运算符。如果您发出

cmd1 && cmd2
仅当cmd2成功时,

cmd1才会运行。这一点很重要(见下文)。

如果您使用&在后​​台运行命令,只需在没有;分隔符的情况下附加下一个命令:

cmd1 & cmd2

&在这种情况下不是逻辑运算符,它告诉bash在后台运行cmd1

在您的情况下,命令行在语法上需要如下所示:

killall vsftpd && /usr/sbin/vsftpd & echo "OK"

然而,我猜你真的是这个意思:

killall vsftpd ; /usr/sbin/vsftpd & echo "OK"

因为否则你将无法启动该进程(如果它尚未运行),因为killall将返回非零返回代码。

即使这样,代码也非常脆弱。我建议使用您的操作系统工具启动vsftp作为守护进程。我指的是命令start-stop-daemon

等设施

答案 1 :(得分:1)

您可以将命令(或命令序列)封装在括号中,如下所示:

# killall vsftpd && (/usr/sbin/vsftpd &) && echo "OK"

但是,这在语义上没有多大意义,因为&&令牌意味着“如果上一个命令成功则运行后续命令”(即返回值为0)和单个&将其前面的命令放入后台(立即继续执行下一个命令),这总是会产生成功。

在你的情况下,除非可执行文件提供运行该东西的命令行参数作为守护进程,否则确实没有任何方法可以确定运行vsftpd命令的成功与否。不需要手动背景。