微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash \u0026\u0026运算符阻止ssh上的背景

在试图找出为什么Capistrano任务(试图在后台启动一个守护进程)挂起之后,我发现使用&&在bash over ssh中阻止后续程序在后台运行.我在bash 4.1.5和4.2.20上尝试过.

以下将在bash中挂起(即等待睡眠完成):

ssh localhost "cd /tmp && nohup sleep 10 >/dev/null 2>&1 &"

以下不会:

ssh localhost "cd /tmp ; nohup sleep 10 >/dev/null 2>&1 &"

这也不会:

cd /tmp && nohup sleep 10 >/dev/null 2>&1 &

在所有情况下,zsh和dash都会在后台执行它,无论&&和和ssh.这是bash或bug的正常/预期行为吗?

一个简单的解决方案是使用:
ssh localhost "(cd /tmp && nohup sleep 10) >/dev/null 2>&1 &"

(这也适用于使用大括号,请参阅下面的第二个示例).

我没有进一步尝试,但我有理由相信它与悬挂的打开文件描述符有关.或许zsh和dash绑定&&所以这意味着必须拼写为:

{ cd /tmp && nohup sleep 10; } >/dev/null 2>&1

在bash.nope,快速实验在破折号显示echo foo&& echo bar>文件重定向后者.不过,它必须与延迟打开fd导致ssh等待更多输出有关;我过去经常遇到这个问题.

还有一个技巧,如果你对这个特殊情况使用括号或大括号,则不需要,但在更一般的上下文中可能会有用,其中使用&&amp ;;更复杂.由于bash似乎与&&&&但不是;你可以转一个&& b&& c进入|| 1号出口; b || 1号出口; C.这适用于测试用例:

ssh localhost "true || exit 1; echo going on; nohup sleep 10 >/dev/null 2>&1 &"

用false替换true,省略“继续”的回显.

(你也可以设置-e,虽然有时这是一个比你想要的更大的锤子.)

原文地址:https://www.jb51.cc/bash/384302.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐