我想在命令行上运行几个命令。
在正常情况下,这很简单:
#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"
在一条线上执行?
答案 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
命令的成功与否。不需要手动背景。