Bash脚本中的下面一行

 echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  ${OUPUT_RESULTS}

给我这个错误:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Why?


当前回答

如果脚本的重定向包含一个变量,并且脚本主体在括号括起来的部分中定义了该变量,则会得到"ambiguous redirect"错误。这里有一个可重复的例子:

Vim a.sh来创建脚本 编辑脚本包含(logit="/home/ubuntu/test.log" && echo "a") >> ${logit} Chmod +x a.sh使其可执行 a.sh

如果你这样做,你会得到“/home/ubuntu/a.sh: line 1: $logit: ambiguous redirect”。这是因为

在括号之间放置一列命令会导致子shell ,并且其中的每个命令都将在其中执行 子shell,无需删除非导出变量。因为列表是 在子shell中执行时,变量赋值不会保持有效 在subshell完成之后。”

从使用括号对表达式进行分组和展开

为了纠正这个问题,你可以在步骤2中修改脚本,定义圆括号外的变量:logit="/home/ubuntu/test.log" && (echo "a") >> $logit

其他回答

Bash有时很迟钝。

对于基本相同的错误,下面的命令都会返回不同的错误消息:

$ echo hello >
bash: syntax error near unexpected token `newline`

$ echo hello > ${NONEXISTENT}
bash: ${NONEXISTENT}: ambiguous redirect

$ echo hello > "${NONEXISTENT}"
bash: : No such file or directory

在变量周围添加引号似乎是处理“模糊重定向”消息的好方法:当您犯了键入错误时,往往会得到更好的消息——当错误是由文件名中的空格引起时,使用引号是解决办法。

如果你在这里试图用GitHub动作调试这个“模糊重定向”错误。我强烈建议这样尝试:

echo "MY_VAR=foobar" >> $GITHUB_ENV

我使用$GITHUB_ENV所经历的行为是,它将其添加到管道环境变量中,如我的示例所示MY_VAR

我最近发现重定向文件名称中的空格会导致“模糊重定向”消息。

例如,如果重定向到应用程序$(date +%Y%m%d%k% m% S).log,并且指定了错误的格式化字符,则重定向将在上午10点之前失败。但是,如果您使用应用程序$(date +%Y%m%d%H% m% S).log则会成功。这是因为%k格式为9AM生成' 9',而%H格式为9AM生成'09'。

echo $(date +%Y%m%d%k% m% S)返回20140626 95138

echo $(date +%Y%m%d%H% m% S)返回20140626095138

错误的日期可能会给出如下内容:

echo "a" > myapp20140626 95138.log

以下是所期望的:

echo "a" > myapp20140626095138.log

如果脚本的重定向包含一个变量,并且脚本主体在括号括起来的部分中定义了该变量,则会得到"ambiguous redirect"错误。这里有一个可重复的例子:

Vim a.sh来创建脚本 编辑脚本包含(logit="/home/ubuntu/test.log" && echo "a") >> ${logit} Chmod +x a.sh使其可执行 a.sh

如果你这样做,你会得到“/home/ubuntu/a.sh: line 1: $logit: ambiguous redirect”。这是因为

在括号之间放置一列命令会导致子shell ,并且其中的每个命令都将在其中执行 子shell,无需删除非导出变量。因为列表是 在子shell中执行时,变量赋值不会保持有效 在subshell完成之后。”

从使用括号对表达式进行分组和展开

为了纠正这个问题,你可以在步骤2中修改脚本,定义圆括号外的变量:logit="/home/ubuntu/test.log" && (echo "a") >> $logit

在变量周围加上引号。如果它碰巧有空格,它也会给你“歧义重定向”。还要检查拼写

echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  "${OUPUT_RESULTS}"

歧义的,模棱两可的

$ var="file with spaces"
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> ${var}
bash: ${var}: ambiguous redirect
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> "${var}"
$ cat file\ with\ spaces
aaaa     dddd         mol_tag