获得“模糊重定向”错误

时间:2010-03-17 13:08:33

标签: bash

我的Bash脚本中的以下行

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

给了我这个错误:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

为什么?

12 个答案:

答案 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)

如果脚本的重定向中包含一个变量,并且脚本主体在括号中的部分中定义了该变量,则将出现“歧义重定向”错误。这是一个可重现的示例:

  1. vim a.sh创建脚本
  2. 编辑脚本以包含(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh使其可执行
  4. 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