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

前端之家收集整理的这篇文章主要介绍了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,虽然有时这是一个比你想要的更大的锤子.)

猜你在找的Bash相关文章