私のBashスクリプトの次の行
echo $AAAA" "$DDDD" "$MOL_TAG >> ${OUPUT_RESULTS}
私にこのエラーを与えます:
line 46: ${OUPUT_RESULTS}: ambiguous redirect
どうして?
OUPUT_RESULTS = "filename.log"
は、あいまいなリダイレクトになります。なぜなら、bashは=
演算子の周囲にスペースを必要としないからです。
私のBashスクリプトの次の行
echo $AAAA" "$DDDD" "$MOL_TAG >> ${OUPUT_RESULTS}
私にこのエラーを与えます:
line 46: ${OUPUT_RESULTS}: ambiguous redirect
どうして?
OUPUT_RESULTS = "filename.log"
は、あいまいなリダイレクトになります。なぜなら、bashは=
演算子の周囲にスペースを必要としないからです。
回答:
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
変数の前後に引用符を追加することは、「あいまいなリダイレクト」メッセージに対処するための良い方法のようです。入力ミスをした場合、およびエラーがファイル名のスペースが原因である場合、より良いメッセージが得られる傾向があります。引用符を使用することが修正です。
sh -c 'echo hello >/tmp/hello' >/tmp/world
正しく動作します。
という名前の変数はありますか、それとも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$
ABC="junk file.txt"
、これはまだ問題があるでしょう。
変数を引用符で囲みます。スペースがある場合は、「あいまいなリダイレクト」も行われます。スペルもチェックしてください
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
最近、リダイレクトファイルの名前に空白があると、「あいまいなリダイレクト」メッセージが表示されることがわかりました。
たとえば、リダイレクトし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
bashスクリプトでこのエラーが発生しました。この問題は、前の行の終わりにある、エラーを発生させる偶発的な\でした。
「あいまいなリダイレクト」を引き起こす可能性があるもう1つのことは\t
\n
\r
、記述している変数名にもあります。
そうでないかもしれない \n\r
?しかし、注意を怠る
これを試して
echo "a" > ${output_name//[$'\t\n\r']}
\t
行の最初でHTMLとタブを解析しているときに、この問題に遭遇しました。
スクリプトのリダイレクトに変数が含まれていて、スクリプトの本体が括弧で囲まれたセクションでその変数を定義している場合、「あいまいなリダイレクト」エラーが発生します。これは再現可能な例です:
vim a.sh
スクリプトを作成するには(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh
実行可能にするa.sh
これを行うと、「/ home / ubuntu / a.sh:1行目:$ logit:あいまいなリダイレクト」が表示されます。それの訳は
「コマンドのリストを括弧の間に置くと、サブシェルが作成され、リスト内の各コマンドは、エクスポートされていない変数を削除せずにそのサブシェルで実行されます。リストはサブシェルで実行されるため、変数の割り当ては残りません実質的にはサブシェルが完了した後です。」
これを修正するには、ステップ2のスクリプトを変更して、括弧の外側の変数を定義します。 logit="/home/ubuntu/test.log" && (echo "a") >> $logit
これもそうかもしれません。
変数でファイルを指定せず、出力をそのファイルにリダイレクトしていない場合、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変数が正しく設定されていないため、これにも注意してください。ところで、このコードはすべてのコンテンツとそのファイル名をコンソールに出力しています。
${OUPUT_RESULTS}
たの?あなたが意味した場合、それはまたスペルエラー$OUTPUT_RESULTS}