nohup运行含嵌套引号与子shell的命令时管道输出丢失问题
问题根源
双引号包裹的字符串中,$(aws ... | tail -1) 这类命令替换会被当前执行nohup的父shell提前解析执行,不会等到nohup拉起的后台子shell运行时再执行。
父shell执行该aws命令时拿不到预期输出(执行时机、运行上下文和前台直接跑命令时不一致),就会把空值替换到命令串里,最终传给子shell的实际执行命令变成echo "some text " >> myfile.txt,写入文件的自然只有固定文本部分。
另外多层双引号嵌套转义很容易出现语法错误,不建议这么写。
修正方案
用单引号包裹传给bash -c的完整命令串,单引号内的所有内容都会被原样传给子shell,父shell不会提前解析里面的命令替换、变量引用,所有逻辑都交给后台启动的bash执行:
nohup bash -c 'echo "some text $(aws ... | tail -1)" >> myfile.txt' &
如果命令中需要引用父shell里的已有变量,把变量部分放在单引号外面拼接即可,比如要引用父shell的$prefix变量:
nohup bash -c 'echo "'"$prefix"' some text $(aws ... | tail -1)" >> myfile.txt' &
可选优化
如果不需要nohup默认生成的nohup.out日志文件,可以把标准输出、标准错误重定向丢弃,避免冗余文件生成:
nohup bash -c 'echo "some text $(aws ... | tail -1)" >> myfile.txt' >/dev/null 2>&1 &
执行后可以用jobs -l查看当前shell关联的后台任务状态,确认任务正常启动。
内容的提问来源于stack exchange,提问作者allstar
相关产品推荐
相关产品推荐

