You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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独有的特性。
  • 解决方案:
    1. 修正脚本shebang:确保脚本第一行是#!/bin/bash,明确指定用Bash执行脚本。
    2. 显式指定Bash运行脚本:如果shebang已正确,也可以在nohup命令中直接指定Bash解释器:
      nohup bash ./InboxOnetimeDoneCorrectedWithMerge.sh >log.txt &
      
    3. 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
      

内容的提问来源于stack exchange,提问作者Suman Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:50:26