「あいまいなリダイレクト」エラーが発生する


173

私のBashスクリプトの次の行

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

私にこのエラーを与えます:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

どうして?


10
すべてを表示しているわけではありません。どこで入手し${OUPUT_RESULTS}たの?あなたが意味した場合、それはまたスペルエラー$OUTPUT_RESULTS}
ghostdog74

書いた場合OUPUT_RESULTS = "filename.log"は、あいまいなリダイレクトになります。なぜなら、bashは=演算子の周囲にスペースを必要としないからです。
Poutrathor、

回答:


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
リダイレクトを含むスクリプトの出力をリダイレクトする場合も、これを取得します。どうやってこれを知っているのか尋ねないでください。
ポールジャクソン

@PaulJackson、...それは真実ではありません。コピーアンドペースト可能なデモンストレーターとして:sh -c 'echo hello >/tmp/hello' >/tmp/world正しく動作します。
Charles Duffy

24

という名前の変数はありますか、それとも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
あなたの場合ABC="junk file.txt"、これはまだ問題があるでしょう。
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
引用は関係ありません。変数の展開にスペースがあると、間違ったファイルに移動したり、ファイル名のスペース後の部分に関連する誤ったエラーメッセージが表示されたりします。
私の正しい意見2010年

@JUSTMYcorrectOPINIONは、シェルは、再解析をしないパラメータ展開の後- 。に充填されている拡張結果内のスペース後の内容は、構文の異なる部分が生じないことを意味
チャールズダフィー

5

最近、リダイレクトファイルの名前に空白があると、「あいまいなリダイレクト」メッセージが表示されることがわかりました。

たとえば、リダイレクトしapplication$(date +%Y%m%d%k%M%S).logて誤ったフォーマット文字を指定すると、リダイレクトは、たとえば午前10時前に失敗します。ただし、使用したapplication$(date +%Y%m%d%H%M%S).log場合は成功します。これは、ある%kフォーマットが生み出す' 9'午前9時のために%H利回り'09'午前9時のために。

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

エラーは、変数にスペースが含まれているかどうかに関係なく、変数を引用符で囲む必要があることです。シェル変数を引用符で囲むタイミングを
tripleee

5

$ {OUPUT_RESULTS}で指定されたパスに空白文字が含まれていますか?その場合は、... >> "${OUPUT_RESULTS}"(引用符を使用して)使用することを検討してください。

(変数名をに変更することも検討してください${OUTPUT_RESULTS}


1

bashスクリプトでこのエラーが発生しました。この問題は、前の行の終わりにある、エラーを発生させる偶発的な\でした。


1

「あいまいなリダイレクト」を引き起こす可能性があるもう1つのことは\t \n \r、記述している変数名にもあります。

そうでないかもしれない \n\r?しかし、注意を怠る

これを試して

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

\t行の最初でHTMLとタブを解析しているときに、この問題に遭遇しました。


エラーは変数を引用していません。シェル変数を引用符で囲むタイミングを
tripleee

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:あいまいなリダイレクト」が表示されます。それの訳は

「コマンドのリストを括弧の間に置くと、サブシェルが作成され、リスト内の各コマンドは、エクスポートされていない変数を削除せずにそのサブシェルで実行されます。リストはサブシェルで実行されるため、変数の割り当ては残りません実質的にはサブシェルが完了した後です。」

グループに括弧を使用して式を展開します

これを修正するには、ステップ2のスクリプトを変更して、括弧の外側の変数を定義します。 logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

シェルコマンドで変数名を使用している場合は、それを+記号で連結する必要があります。

例えば ​​:

2つのファイルがあり、ファイル名をハードコーディングしない場合は、代わりに変数名を使用します。
"input.txt" = x
"output.txt" = y

次に( '引用符で囲まれたシェルコマンド' + 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により、テキストがstdoutに書き込まれなくなります

ファイルに追加したい場合は、 tee -a

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.