如何结合大括号(curly braces)使用nohup命令?
解决nohup运行stdout/stderr分流命令的语法错误问题
问题原因
nohup 仅能直接调用外部命令或简单命令,你使用的 { ... } 属于 Bash 的复合命令,直接放在 nohup 后会被识别为未知命令,从而触发语法错误。
修正方案
用 bash -c 将整个复合命令包裹,让 Bash 子进程解析这个复合语法结构,修正后的命令如下:
nohup bash -c '{ foo 2>&1 1>&3 3>&- | sed -u '\''s/^/err: /'\''; } 3>&1 1>&2 | sed -u '\''s/^/out: /'\''' >/dev/null 2>&1 &
细节说明
- 原命令中的单引号
'需要转义为'\'',避免和bash -c外层的单引号冲突; - 整个复合命令作为字符串参数传递给
bash -c,由子 Bash 进程负责解析执行大括号、重定向、管道等特殊语法。
验证方法
- 先给
foo脚本添加执行权限:chmod +x foo - 运行修正后的命令,执行
ps aux | grep foo可确认进程正常运行; - 若要查看输出效果,可临时移除
>/dev/null 2>&1,查看nohup.out文件,会看到按规则标记的输出:out: a err: b out: a err: b ...
内容的提问来源于stack exchange,提问作者user180574
相关产品推荐
相关产品推荐

