Bash脚本中的下面一行
echo $AAAA" "$DDDD" "$MOL_TAG >> ${OUPUT_RESULTS}
给我这个错误:
line 46: ${OUPUT_RESULTS}: ambiguous redirect
Why?
Bash脚本中的下面一行
echo $AAAA" "$DDDD" "$MOL_TAG >> ${OUPUT_RESULTS}
给我这个错误:
line 46: ${OUPUT_RESULTS}: ambiguous redirect
Why?
你有一个名为OUPUT_RESULTS的变量吗?还是更可能是OUTPUT_RESULTS?
michael@isolde:~/junk$ ABC=junk.txt
michael@isolde:~/junk$ echo "Booger" > $ABC
michael@isolde:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
michael@isolde:~/junk$
在${OUPUT_RESULTS}中指定的路径是否包含任何空白字符?如果是这样,你可能要考虑使用……>> "${OUPUT_RESULTS}"(使用引号)。
(你也可以考虑将你的变量重命名为${OUTPUT_RESULTS})
在变量周围加上引号。如果它碰巧有空格,它也会给你“歧义重定向”。还要检查拼写
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
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
在变量周围添加引号似乎是处理“模糊重定向”消息的好方法:当您犯了键入错误时,往往会得到更好的消息——当错误是由文件名中的空格引起时,使用引号是解决办法。
我最近发现重定向文件名称中的空格会导致“模糊重定向”消息。
例如,如果重定向到应用程序$(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
另一个可能导致“模糊重定向”的东西是你所写的变量名中的\t \n \r
也许不是\n\r?但宁可慎之又慎
试试这个
echo "a" > ${output_name//[$'\t\n\r']}
我在解析HTML时遇到了这个问题,tab \t在行首。
如果脚本的重定向包含一个变量,并且脚本主体在括号括起来的部分中定义了该变量,则会得到"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
如果在shell命令中使用变量名,则必须将其与+号连接。
例如:
如果您有两个文件,并且您不打算硬编码文件名,而是希望使用变量名 "input.txt" = x "output.txt" = y
然后('shell command within quotes' + x > + y)
它将以这种方式工作,特别是如果你在os的python程序中使用它。系统命令可能
这也可能是事实。
您没有在变量中指定文件并将输出重定向到该文件,那么bash将抛出此错误。
files=`ls`
out_file = /path/to/output_file.t
for i in `echo "$files"`;
do
content=`cat $i`
echo "${content} ${i}" >> ${out_file}
done
Out_file变量没有正确设置,所以也要注意这一点。 顺便说一下,这段代码将打印控制台上的所有内容及其文件名。
在尝试使用大括号展开将输出写入多个文件时,我得到了此错误。
例如:echo "text" > {f1,f2}.txt将导致-bash: {f1,f2}.txt:模糊重定向
在这种情况下,使用tee输出到多个文件:
echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null
1>/dev/null将阻止将文本写入标准输出
如果你想追加到文件中,使用tee -a
在我的例子中,这是一个有用的警告,因为目标变量(不是文件)拼写错误并且不存在。
echo "ja" >> $doesNotExist
导致
./howdy.sh: line 4: $doesNotExist: ambiguous redirect
如果你在这里试图用GitHub动作调试这个“模糊重定向”错误。我强烈建议这样尝试:
echo "MY_VAR=foobar" >> $GITHUB_ENV
我使用$GITHUB_ENV所经历的行为是,它将其添加到管道环境变量中,如我的示例所示MY_VAR
对于我的例子,如果我通过env指定输出文件(例如$ENV_OF_LOG_FILE),那么将得到错误模糊重定向。
但是,如果我使用纯文本作为文件路径(例如/path/to/log_file),那么就没有错误。