使用nohup运行含cat命令的Shell脚本出现语法错误的原因
问题描述
我在Shell脚本InboxOnetimeDoneCorrectedWithMerge.sh中添加了如下cat命令:
cat $Files/"AML_BM_"$date".TXT" <(tail --lines=+2 $Files/"BRANCHMOG.txt") > $Files/"AML_BM_PLUS_BRANCHMOG_"$date".TXT"
直接执行./InboxOnetimeDoneCorrectedWithMerge.sh时脚本运行正常,但使用nohup ./InboxOnetimeDoneCorrectedWithMerge.sh >log.txt &后台运行时,出现如下错误:
./InboxOnetimeDoneCorrectedWithMerge.sh: line 88: syntax error near unexpected token `(' ./InboxOnetimeDoneCorrectedWithMerge.sh: line 88: `cat $Files/"AML_BM_"$date".TXT" <(tail --lines=+2 $Files/"BRANCHMOG.txt") > $Files/"AML_BM_PLUS_BRANCHMOG_"$date".TXT"'
请问为何后台运行时会抛出该语法错误?
问题原因与解决办法
- 核心原因:进程替换(
<(...))是Bash的扩展语法,不属于POSIX标准Shell的规范。当通过nohup后台运行脚本时,系统可能默认调用了POSIX标准的sh而非bash来执行脚本,导致无法识别该扩展语法,从而抛出语法错误。 - 验证要点:检查脚本的第一行shebang声明,确认是否为
#!/bin/bash。如果写的是#!/bin/sh,在多数类Unix系统中sh是轻量POSIX Shell(如dash),不支持进程替换这类Bash独有的特性。 - 解决方案:
- 修正脚本shebang:确保脚本第一行是
#!/bin/bash,明确指定用Bash执行脚本。 - 显式指定Bash运行脚本:如果shebang已正确,也可以在
nohup命令中直接指定Bash解释器:nohup bash ./InboxOnetimeDoneCorrectedWithMerge.sh >log.txt & - POSIX兼容替代方案:如果需要脚本兼容POSIX标准Shell,可以用临时文件替代进程替换:
# 生成临时文件存储tail结果 tail --lines=+2 "$Files/BRANCHMOG.txt" > /tmp/tmp_branchmog.tmp # 合并文件 cat "$Files/AML_BM_$date.TXT" /tmp/tmp_branchmog.tmp > "$Files/AML_BM_PLUS_BRANCHMOG_$date.TXT" # 删除临时文件 rm /tmp/tmp_branchmog.tmp
- 修正脚本shebang:确保脚本第一行是
内容的提问来源于stack exchange,提问作者Suman Kumar
相关产品推荐
相关产品推荐

