收到“歧义重定向”错误


173

我的Bash脚本中的以下行

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

给我这个错误:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

为什么?


10
您没有显示全部。你从哪儿得到的${OUPUT_RESULTS}。如果您是$OUTPUT_RESULTS}
故意的,

如果一个人写了OUPUT_RESULTS = "filename.log"一个,将会得到歧义的重定向。因为bash希望=操作员周围没有空格。
Poutrathor

Answers:


269

有时候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
You'll also get this if you redirect the output of a script that contains redirects. Don't ask me how I know this.
Paul Jackson

@PaulJackson, ...that's not true. As a copy-and-pasteable demonstrator: sh -c 'echo hello >/tmp/hello' >/tmp/world works properly.
Charles Duffy

24

Do you have a variable named OUPUT_RESULTS or is it the more likely 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
If your ABC="junk file.txt", this would still have the problem.
Charles Duffy

15

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

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

1
行情无关紧要。如果变量扩展中有空格,您只会将内容转到错误的文件和/或涉及文件名的后空格部分的虚假错误消息。
我的正确观点

@JUSTMYcorrectOPINION, the shell doesn't re-parse after parameter expansions -- meaning that contents after the space within expansion results can't result in a different piece of syntax being filled in.
Charles Duffy

5

我最近发现重定向文件名称中的空格将导致“歧义重定向”消息。

例如,如果您重定向到application$(date +%Y%m%d%k%M%S).log并指定了错误的格式字符,则重定向将在10 AM之前失败。但是,如果您使用application$(date +%Y%m%d%H%M%S).log它会成功。这是因为%k格式会产生' 9'9AM,其中%H产生'09' 9AM。

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

错误是,无论变量是否包含空格,都应在变量两边加上引号。请参阅何时将引号括在shell变量周围?
人间

5

$ {OUPUT_RESULTS}中指定的路径是否包含任何空格字符?如果是这样,您可能要考虑使用... >> "${OUPUT_RESULTS}" (using quotes).

(您可能还需要考虑将变量重命名为${OUTPUT_RESULTS}


1

我只是在bash脚本中遇到此错误。问题是前一行结尾处的意外\,它给出了错误。


1

One other thing that can cause "ambiguous redirect" is \t \n \r in the variable name you are writing too

Maybe not \n\r? But err on the side of caution

Try this

echo "a" > ${output_name//[$'\t\n\r']}

I got hit with this one while parsing HTML, Tabs \t at the beginning of the line.


错误未引用变量。请参阅何时将引号括在shell变量周围?
人间

1

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

  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,并且列表中的每个命令都将在该子shell中执行,而不会删除未导出的变量。由于该列表是在子shell中执行的,因此不会保留变量分配在子shell完成后生效。”

使用括号分组和扩展表达式

To correct this, you can modify the script in step 2 to define the variable outside the parenthesis: logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

if you are using a variable name in the shell command, you must concatenate it with + sign.

for example :

if you have two files, and you are not going to hard code the file name, instead you want to use the variable name
"input.txt" = x
"output.txt" = y

然后(“引号内的shell命令” + x> + y)

它将以这种方式工作,特别是如果您正在os.system命令中的python程序中使用它的话


0

也可能是这种情况。

您尚未在变量中指定文件并将其重定向到该文件,则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变量未正确设置,因此也请注意这一点。顺便说一句,此代码正在控制台上打印所有内容及其文件名。


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将防止文本被写入标准输出

如果要附加到文件,请使用 tee -a

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.