Одним из простых решений является использование:
ssh localhost "(cd /tmp && nohup sleep 10) >/dev/null 2>&1 &"
(это также работает, если вы используете фигурные скобки, см. Второй пример ниже).
Я не экспериментировал дальше, но я разумно убежден, что это связано с открытыми дескрипторами файлов. Возможно, zsh и dash связывают &&
так, что это означает, что должно быть записано как:
{ cd /tmp && nohup sleep 10; } >/dev/null 2>&1
в bash.
Нет, быстрый эксперимент в dash показывает, что
echo foo && echo bar >file
только перенаправляет последнее. Тем не менее, это как-то связано с длительным открытием fd, заставляющим ssh ждать большего вывода; Я сталкивался с этим много в прошлом.
Еще один трюк, который не нужен, если вы используете скобки или фигурные скобки для этого конкретного случая, но может быть полезен в более общем контексте, где набор команд для
&&
более сложный. Поскольку bash, похоже, неправильно использует дескриптор файла с
&&
, но не с
;
, вы можете превратить
a && b && c
в
a || exit 1; b || exit 1; c
. Это работает с тестовым примером:
ssh localhost "true || exit 1; echo going on; nohup sleep 10 >/dev/null 2>&1 &"
Заменить true
на false
, и эхо "происходит" пропущено.
(Вы также можете set -e
, хотя иногда это больше, чем хотелось бы.)