什么时候使用 spawn.with_shell 什么时候只需要 spawn ?

When to use spawn.with_shell and when spawn is only needed?

我很困惑什么时候应该使用 awful.spawn 什么时候使用 awful.spawn.with_shell。对我来说,它们看起来和工作方式都一样。
我看到的唯一区别是,在 awful.spawn 中,您可以设置客户端规则并进行回调。

我将不胜感激任何关于何时使用它们的示例或规则。

awful.spawn.with_shell 除了使用 shell 生成给定的命令之外,实际上并没有做更多的事情:https://github.com/awesomeWM/awesome/blob/c539e0e4350a42f813952fc28dd8490f42d934b3/lib/awful/spawn.lua#L370-L371

function spawn.with_shell(cmd)
    if cmd and cmd ~= "" then
        cmd = { util.shell, "-c", cmd }
        return capi.awesome.spawn(cmd, false)
    end
end

那么,为什么要这样呢?有些事情是由 shells 完成的。例如,输出重定向 (echo hi > some_file)、命令序列 (echo 1; echo 2) 或管道 (echo hello | grep ell) 都是由 shell 完成的。 None 这些在正确启动进程时有效。

为什么有人不想要 shell?例如,当涉及 shell 时,参数转义要复杂得多。当你例如想要开始打印一个管道符号(不知道为什么需要那个),然后 awful.spawn({"echo", "|"}) 就可以工作,而对于 shell 你需要将管道符号转义适当的次数。我想 awful.spawn.with_shell("echo \\|") 会起作用,但我不确定,这就是重点。

此外,什么都不做的 shell 是一个额外的过程,并且比没有 shell 慢一点点,但这种差异并不重要。