【问题标题】:Multiple commands on a single line in Linux [duplicate]Linux中单行上的多个命令[重复]
【发布时间】:2016-03-17 16:00:38
【问题描述】:

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

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

#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"

单行执行?

【问题讨论】:

    标签: linux command-line


    【解决方案1】:

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

    cmd1 ; cmd2 ; cmd3
    

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

    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 这样的设施。

    【讨论】:

    • 感谢您指出&&; 之间的区别。似乎在大多数情况下;&& 更可取。
    【解决方案2】:

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

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

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

    在您的情况下,实际上没有任何方法可以确定在后台运行 vsftpd 命令是否成功,除非可执行文件提供将事物作为守护进程运行的命令行参数,因此您不需要后台手动。

    【讨论】:

      猜你喜欢
      • 2014-04-22
      • 1970-01-01
      • 2016-12-03
      • 2016-10-30
      • 2018-01-24
      • 2013-05-27
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多