自作シェルの進捗(2025年4月15日)

Tue Apr 15 18:09:56 JST 2025 (modified: Tue Apr 15 18:50:52 JST 2025)
views: 607, keywords:自作シェル,rusty_bash,寿司シェル

 前回(3月29日)からの進捗です。

macOSでの補完

 alphaブランチのコードでほぼ動くようになりました。ただし、bash-completionを読み込むときにいくつかエラーが出ます。これについてはもうちょっと整理してから改めてここに書きたいと思ってます。

Bashの公式リポジトリのテスト

 とりあえずこんな感じでじわじわ対応中です。

current compatibility of #rusty_bash to #bash

[image or embed]

— Ryuichi Ueda (@ueda.tech) 2025年4月15日 17:24

通ったテストは、

  • run-invert: !で終了ステータスをひっくり返す機能のテスト
  • run-precedence: &&||の優先度のテスト
  • run-ifs: IFSまわりのテスト
  • run-globstar: globstar(ワイルドカード**)のテスト
  • run-braces: ブレース展開のテスト
  • run-extglob2: 拡張グロブのテスト
  • run-extglob3: 同上

です。あと、エラーメッセージが一致せず通ってませんが、run-arith(算術式展開のテスト)も標準出力はすべて一致してます。こういうテスト、アーキテクチャが悪いとあっちを直すとこっちがおかしくなり、ということが起こりがちですが、とりあえずいまのところは大丈夫そうです。ただ、あと76個通さないといけないので、辛いです。

 テストでおもしろかったのをいくつか挙げときます。Bashの公式リポジトリ内にあります。

tests/arith3.subのなかのテスト

 RANDOMなのに毎回同じ結果にならないといけないそうです。いや、まあそうなんですが、それテストしなきゃいけないんでしょうか?合わせるの大変でした。


   RANDOM=42
   
   (( dice[RANDOM%6+1 + RANDOM%6+1]+=v )) #必ず6にならないといけない
   echo ${dice[6]}
   
   (( dice[RANDOM%6+1 + RANDOM%6+1]-=v )) #必ず7にならないといけない
   echo ${dice[7]}
   
   (( dice[RANDOM%6+1 + RANDOM%6+1]+=2 )) #以下同様
   echo ${dice[8]}
   
   (( dice[RANDOM%6+1 + RANDOM%6+1]*=2 ))
   echo ${dice[5]}
   
   ### これ以上同じコードがあったらたぶん無理 ###
   ### (6, 7, 8, 5, ...という並びをあわせられない) ###

tests/arith6.sub

 これがrun-arithのラスボスでした。変数が数値になるまで何回も評価されることを利用した再帰処理です。

n=0 a="(a[n]=++n)<7&&a[0]"; ((a[0])); echo "${a[@]:1}"
   ### 出力は「1 2 3 4 5 6 7」###

できました(死ぬ)

This is an example. #bash #rusty_bash

[image or embed]

— Ryuichi Ueda (@ueda.tech) 2025年4月9日 18:03

tests/dollar-at-star

 これはIFSに区切り文字をセットしたときの$*の挙動をテストするスクリプトです。技術的な面白さもそうなんですが、set bob 'tom dick harry' joeで間抜けな5人組の顔が思い浮かんで笑いが止まらなくなりました。


   IFS='/'
   set bob 'tom dick harry' joe
   set $*
   recho $#
   recho $1
   recho $2
   recho $3

 ちなみに出力はこうならないといけません。


   $ IFS='/'
   $ set bob 'tom dick harry' joe
   $ set $*
   $ echo $1
   bob
   $ echo $2
   tom dick harry
   $ echo $3
   joe

以上です。またなんか面白いのがあれば紹介します。

クソバグのfix

 で、さっきrun-arithの標準出力が一致して事実上テストが通ったみたいな話を書いたのですが、実は上に挙げたラスボスを倒して通ったにもかかわらず、自作シェルが小学生でもやらん計算間違いをすることが判明しました。


   🍣 echo $(( 1 - 2 + 3 ))
   -4   # 1 - (2 + 3) だと思っているっぽい

Bashのテストでも自分のテストでも漏れてたみたいです。いやーこわいですね。仕事だと思ったら背筋が凍ります。

 これは結局、計算式を逆ポーランド記法に直すときに、-より+を優先させてしまっていたという初歩的なミスでした。なんで全部テスト通ったんだろ・・・。

 もう一つ反省のために除去したクソバグを紹介しておくと、こういうのもありました。

readが標準入力を読む前に、続きのシェルスクリプトを読んでしまうというアホみたいなバグで、すぐ除去しました。

 いやーこわいこわい。現場からは以上です。

ノート   このエントリーをはてなブックマークに追加 
 

prev:自作シェルの進捗(2025年3月29日その2) next:自作シェルの進捗(2025年4月15日)

やり散らかし一覧

記事いろいろ