変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

2024年8月28日

[シェルスクリプト]思い込みが強すぎるとバグる

if cp from to; then
  echo "コピーに成功しました"
else
  echo "コピーに失敗しました"
fi

という記事を見つけた。

cpのExit Statusは0は成功、0以外はエラーなので、上のコードで大正解なのだが、気に入らないらしい。

わざわざgrepを持ち出して、grep ‘[‘なら文法エラーで$?に2が入るから

if echo test | grep '['; then
  echo "文字列が見つかりました"
else
  case $? in
    1) echo "文字列が見つかりません" ;;
    2) echo "エラーが発生しました(終了ステータス: $?)" ;;
  esac
fi

うううん。素晴らしい。(だそうだ

だが、そうだろうか?

2) の後の$?は必ず 2 になるハズだから、

この組み合わせには不整合の臭いがする。

ちなみに

grepのExit Statusは

grepのステータス意味
0一致が見つかりました。
1一致が見つかりませんでした。
>1構文エラーが見つかったか、(一致が見つかったとしても) ファイルにアクセスできませんでした。

らしいので、明日にでも、>2が実装されれば、その事象が発生すると先のコードでは何も表示しないのだ。

よって・・・

if echo test | grep '['; then
  echo "文字列が見つかりました"
else
  case $? in
    1) echo "文字列が見つかりません" ;;
    2) echo "grepのオプションの構文エラーな気がする" ;;
    *) echo "ボクの知らないエラーが発生しました(終了ステータス: $?)" ;;
  esac
fi

が良い様な気がする。

今は想定外である( 3とか4など )な結果に対して、デグレードしているのは良くない。(と思う。

とかく、

  • ソースコードの書き方がよろしくない!
  • ソースコードが美しくない!
  • カバレッジテストで通らないコードがある!

な記事の多くには、バグ(あるいはデグレード)が含まれている。

主に経験不足なんだろうけど、そう云う香り(臭いではない)を楽しむのも風流かもしれない。

そもそもシェルファイル内で検索したい文字列をべた書きする事は稀で

WORD= "9999"
TEXT= "9999"
if echo $TEXT | grep $WORD ; then
  echo "$WORDが見つかりました"
else
  case $? in
    1) echo "'$WORD'が見つかりません" ;;
    2) echo "'$WORD'検索中にgrepのオプションの構文エラーが起きた気がする" ;;
    *) echo "'$WORD'検索中に不明なエラー($?)が発生しました" ;;
  esac
fi

の様に書く事が多い。

だって!

上のコードで云えば、grep 9999 と書けば

マジックナンバー扱いになるじゃないですかねぇ~(笑

それにechoの出力に検索したいテキストを埋め込むことも考えに入っていない。

そもそも・・・・・・・・

最初のコードに(終了ステータス: $?)を追記して

if cp from to; then
  echo "コピーに成功しました"
else
  echo "コピーに失敗しました(終了ステータス: $?)"
fi

とするだけでデメリット?らしいとこも無くなる。

やはり、

経験がかなり不足していると思える

て云うか、WindowsのBATファイルより少しマシな程度のものだから

デバッグのしやすさの方が優先するならソースデバッガが使えるpythonやnode.jsで書いた方が楽。

話がそれるけど・・・

man コマンド名でExit statusが見つけにくい

様に思う。

オプション多すぎ。




top