1

うーん:

$ エコー 2 4 | 紀元前
(standard_in) 1: 解析エラー
$ エコー $?
0

解析エラーを認識したときに、それ以外の場合は完全に合理的なプログラムが成功するのはなぜでしょうか? 明らかに、bc を使用して式を評価することはできません。個人的には dc が好きですが、私のユーザーは逆研磨を望んでいません。bc が認識する形式の算術式が与えられた場合、結果を評価するための適切なプログラムはありますか? または、bc を合理的にする方法はありますか? (ここで「合理的」とは、入力が偽の場合に失敗することを意味します。)

4

2 に答える 2

3

bcエラーからの回復を試み、以降のステートメントの処理を続けます。例えば:

$ echo "2 + 3; 
    4 4;
    3 + 4" | bc
5
(standard_in) 2: parse error
7

したがって、その場合にエラーを返す必要があるかどうかは明確ではありません。入力を正常に解析および処理し、エラーから正しく回復して、後の命令の処理を続行しました。POSIXによるとbc、非対話モードで無効な入力が検出された場合の の動作は定義されていないため、これはどのようにbc動作するかの仕様の範囲内です。

入力の処理中にエラーが発生したかどうかをテストしたい場合は、stderr を一時ファイルにリダイレクトし、その内容をチェックしてエラーを探すことができます。

bcerr=$(mktemp -t bcerr)
result=$(echo 2 4 | bc 2>$bcerr)
if test -s $bcerr
then
  # handle errors
else 
  # handle success
fi
rm $bcerr
于 2011-04-19T17:12:08.927 に答える
0

bcstderr の出力を確認するか、stderr を /dev/null にリダイレクトして出力が空であることを認識することで、エラーをキャッチできます。

answer=$(echo "$expression" | bc 2>/dev/null)
if [ -z "$answer" ]; then
    echo "error in $expression"
fi
于 2011-04-19T16:38:49.437 に答える