如何在保持第一个命令运行的同时阻止链中的第二个命令?

Max*_*tti 27 shutdown command-line zsh job-control

昨天临睡前,我开始了一个漫长的过程,我认为它在我站起来之前就完成了,所以我使用了

./command && sudo poweroff
Run Code Online (Sandbox Code Playgroud)

我的系统配置为不要求输入密码sudo poweroff,因此在该命令完成后它应该关闭。

但是它仍在运行,我现在想将该系统用于其他任务。让该命令在后台运行不是问题,但让我的系统随时可能关闭才是问题。

有没有办法防止zsh执行poweroff命令,同时确保第一个命令运行直到完成?

/etc/sudoers在这种情况下,编辑文件以便系统询问我的密码是否仍然有帮助?

Sté*_*las 35

正如您在评论中澄清的那样,它仍然在交互式 shell 的前台运行,您应该只需按Ctrl+Z.

这将暂停./command工作。除非./command在这种情况下(不太可能)实际拦截SIGTSTP信号并选择退出(0),否则退出状态将为非0(128+SIGTSTP,一般为148),因此sudo poweroff不会运行。

然后,您可以./command使用fg或恢复前景或背景bg

您可以使用以下方法进行测试:

sleep 10 && echo poweroff
Run Code Online (Sandbox Code Playgroud)

并看到poweroff当您按下Ctrl+Z并稍后使用fg/恢复时不会输出bg

或与

sleep 10 || echo "failed: $?"
Run Code Online (Sandbox Code Playgroud)

failed: 148按就看到了Ctrl+Z

请注意,这适用于zsh并假设您以./command && sudo poweroff. 它可能对其他外壳无效,如果您以其他方式启动它,例如(./command && sudo poweroff)在子外壳中或{ ./command && sudo poweroff; }作为复合命令的一部分(zsh与大多数其他外壳相反,它会转换为子外壳,因此它可以作为暂停时的一个整体)。

  • @OlivierDulac,不,它不会,不在`zsh` 中,`&& sudo poweroff` 将在`./command` 挂起并且作业第一次*返回* 时被评估,退出状态为148。它是只有当你输入 `fg && sudo poweroff` 而不是单独的 `fg` 时,`sudo poweroff` 才会在 `./command` 成功退出后运行(不会再次挂起)。 (2认同)
  • 哇,这太出乎意料了... && 或 || 通常在那里确保右手部分仅在左手部分完成时完成(并且以 0 或 > 0 退出)。暂停不应该改变这一点,它没有意义(并且违反直觉)。感谢您的提醒(我通常很乐意在需要时使用 ctrl-z 暂停某些东西,但现在我会很担心命令是否复杂) (2认同)
  • @OlivierDulac,但如果必须像你说的那样做,shell 将如何处理它?请注意,`zsh` 的行为已经是对大多数其他 shell 的改进,例如,当你在一个函数或复合命令运行时按下 Ctrl-Z 时,它会中断整个命令,你可以稍后恢复它,尽管那已经完成了在子shell中,因此在子shell环境中,这意味着一旦中断和恢复的函数返回,更改就会丢失。在这里,如果您希望能够停止/恢复一条链,您应该在子 shell 中启动它。 (2认同)

Bib*_*Bib 8

您可以暂时重命名 /sbin/poweroff 。

  • 如果你真的很厚脸皮,你可以暂时重命名`/bin/sudo`。:) (8认同)