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,虽然有时这是一个比你想要的更大的锤子.)

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...