【问题标题】:Getting an "ambiguous redirect" error收到“不明确的重定向”错误
【发布时间】:2021-03-14 19:30:12
【问题描述】:

我的 Bash 脚本中的以下行

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

给我这个错误:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

为什么?

【问题讨论】:

  • 你没有显示全部。你从哪里得到${OUPUT_RESULTS}。如果您的意思是$OUTPUT_RESULTS},它也是拼写错误
  • 如果一个人写了OUPUT_RESULTS = "filename.log" 一个人会得到不明确的重定向。因为 bash 想要在 = 运算符周围没有空格。

标签: bash


【解决方案1】:

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

在变量周围添加引号似乎是处理“歧义重定向”消息的好方法:当您输入错误时,您往往会收到更好的消息 - 当错误到期时到文件名中的空格,使用引号是解决方法。

【讨论】:

  • 如果您重定向包含重定向的脚本的输出,您也会得到此信息。不要问我是怎么知道的。
  • @PaulJackson,...这不是真的。作为可复制粘贴的演示者:sh -c 'echo hello >/tmp/hello' >/tmp/world 工作正常。
  • 也许是一个有价值的补充,对我来说使用 sh 而不是 bash 是一个解决方案。这个:for f in onfw/*;做 xslt -xsl:dwsToTEI.xslt -s:- data/basename "$f"; done 在 sh 中工作,bash 为带有空格的文件名提供了一个模棱两可的重定向(引用没有帮助)
【解决方案2】:

您是否有一个名为 <b>OU</b>PUT_RESULTS 的变量,还是更有可能是 <b>OUT</b>PUT_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$ 

【讨论】:

  • 如果你的ABC="junk file.txt",这还是有问题的。
  • 这个答案也让我找到了我的解决方案。我将变量定义为INPUT,但将其用作Input。区分大小写的胜利!
【解决方案3】:

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

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

【讨论】:

  • 行情无关紧要。如果变量扩展中有空格,您只会得到错误的文件和/或涉及文件名的后空格部分的虚假错误消息。
  • @JUSTMYcorrectOPINION,shell 在参数扩展后不会重新解析——这意味着扩展结果中空格后的内容不会导致填充不同的语法。
【解决方案4】:

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

例如,如果您重定向到 application$(date +%Y%m%d%k%M%S).log 并指定了错误的格式字符,则重定向将在上午 10 点之前失败。但是,如果您使用application$(date +%Y%m%d%H%M%S).log,它将成功。这是因为%k 格式在上午 9 点生成 ' 9',而 %H 在上午 9 点生成 '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】:

${OUPUT_RESULTS} 中指定的路径是否包含任何空白字符?如果是这样,您可能需要考虑使用... &gt;&gt; "${OUPUT_RESULTS}"(使用引号)。

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

【讨论】:

    【解决方案6】:

    我刚刚在 bash 脚本中遇到了这个错误。问题是上一行末尾的意外 \ 导致错误。

    【讨论】:

      【解决方案7】:

      另一个可能导致“不明确重定向”的事情是您正在编写的变量名中的\t \n \r

      也许不是\n\r?但要谨慎行事

      试试这个

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

      我在解析 HTML 时遇到了这个问题,行首的 Tabs \t

      【讨论】:

      【解决方案8】:

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

      1. vim a.sh 创建脚本
      2. 编辑脚本以包含(logit="/home/ubuntu/test.log" &amp;&amp; echo "a") &gt;&gt; ${logit}
      3. chmod +x a.sh 使其可执行
      4. a.sh

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

      “将命令列表放在括号之间会导致子shell 被创建,并且列表中的每个命令都将在其中执行 子shell,不删除未导出的变量。由于列表是 在子shell中执行,变量赋值不会保持有效 子shell完成后。”

      来自Using parenthesis to group and expand expressions

      要更正此问题,您可以修改步骤 2 中的脚本以定义括号外的变量:logit="/home/ubuntu/test.log" &amp;&amp; (echo "a") &gt;&gt; $logit

      【讨论】:

        【解决方案9】:

        也可能是这种情况。

        你没有在变量中指定文件并将输出重定向到它,那么 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 变量设置不正确,因此也要注意这一点。 顺便说一句,此代码正在控制台上打印所有内容及其文件名。

        【讨论】:

          【解决方案10】:

          尝试使用大括号扩展将输出写入多个文件时出现此错误。

          例如:echo "text" &gt; {f1,f2}.txt 导致 -bash: {f1,f2}.txt: ambiguous redirect

          这种情况下,使用tee输出到多个文件:

          echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null
          

          1&gt;/dev/null 将阻止将文本写入 stdout

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

          【讨论】:

            【解决方案11】:

            如果您在 shell 命令中使用变量名,则必须将其与+ 符号连接起来。

            例如:

            如果您有两个文件,并且您不打算硬编码文件名,而是想使用变量名
            "input.txt" = x
            "output.txt" = y

            then ('引号内的shell命令' + x > + y)

            它会以这种方式工作,特别是如果你在一个带有 os.system 命令的 python 程序中使用它可能

            【讨论】:

              【解决方案12】:

              在我的例子中,这是一个有用的警告,因为目标变量(不是文件)拼写错误并且不存在。

              echo "ja" >> $doesNotExist
              

              导致

              ./howdy.sh: line 4: $doesNotExist: ambiguous redirect
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多