我的Bash脚本中的以下行
echo $AAAA" "$DDDD" "$MOL_TAG >> ${OUPUT_RESULTS}
给了我这个错误:
line 46: ${OUPUT_RESULTS}: ambiguous redirect
为什么?
答案 0 :(得分:234)
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
在变量周围添加引号似乎是处理“模糊重定向”消息的好方法:当您输入错误时,您倾向于获得更好的消息 - 而当错误到期时,对于文件名中的空格,使用引号是修复。
答案 1 :(得分:22)
您是否有名为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$
答案 2 :(得分:14)
在变量周围加上引号。如果碰巧有空格,它也会给你“模糊的重定向”。还检查你的拼写
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
答案 3 :(得分:5)
$ {OUPUT_RESULTS}中指定的路径是否包含任何空格字符?如果是这样,您可能需要考虑使用... >> "${OUPUT_RESULTS}"
(使用引号)。
(您可能还想考虑将变量重命名为${OUTPUT_RESULTS}
)
答案 4 :(得分:5)
我最近发现重定向文件名称中的空格会导致"模糊重定向"消息。
例如,如果您重定向到application$(date +%Y%m%d%k%M%S).log
并指定了错误的格式化字符,则重定向将在上午10点之前失败。但是,如果您使用application$(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
答案 5 :(得分:1)
另一件可能导致“模糊重定向”的事情是您正在编写的变量名称中的\t
\n
\r
也许不是\n\r
?但是谨慎一点
试试这个
echo "a" > ${output_name//[$'\t\n\r']}
我在解析HTML时遇到了这个问题,在行的开头标记了\t
。
答案 6 :(得分:1)
我刚刚在bash脚本中遇到此错误。这个问题是在上一行结束时发生错误的意外\。
答案 7 :(得分:1)
也可能是这种情况。
您尚未在变量中指定文件并将输出重定向到该文件,然后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 变量未正确设置,因此也请注意这一点。 顺便说一句,此代码正在控制台上打印所有内容及其文件名。
答案 8 :(得分:0)
如果脚本的重定向中包含一个变量,并且脚本主体在括号中的部分中定义了该变量,则将出现“歧义重定向”错误。这是一个可重现的示例:
vim a.sh
创建脚本(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh
使其可执行a.sh
如果执行此操作,则会得到“ /home/ubuntu/a.sh:第1行:$ logit:模糊重定向”。这是因为
“在括号之间放置命令列表会导致子外壳 被创建,列表中的每个命令都将在其中执行 子外壳程序,而不删除未导出的变量。由于列表是 在子shell中执行时,变量分配不会保持有效 子外壳程序完成后。”
来自Using parenthesis to group and expand expressions
要解决此问题,您可以在步骤2中修改脚本以在括号之外定义变量:logit="/home/ubuntu/test.log" && (echo "a") >> $logit
答案 9 :(得分:0)
如果在shell命令中使用了变量名,则必须使用+
符号将其连接。
例如:
如果您有两个文件,并且不打算对文件名进行硬编码,而是要使用变量名
"input.txt" = x
"output.txt" = y
然后(“引号中的shell命令” + x> + y)
它将以这种方式工作,特别是如果您正在os.system命令中的python程序中使用它
答案 10 :(得分:0)
尝试使用括号扩展将输出写入多个文件时出现此错误。
例如:echo "text" > {f1,f2}.txt
产生-bash: {f1,f2}.txt: ambiguous redirect
在这种情况下,使用tee
输出到多个文件:
echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null
1>/dev/null
将阻止文本写入 stdout
如果要附加到文件,请使用tee -a
答案 11 :(得分:0)
就我而言,这是一个有用的警告,因为目标变量(不是文件)拼写错误并且不存在。
echo "ja" >> $doesNotExist
导致
./howdy.sh: line 4: $doesNotExist: ambiguous redirect