自作シェルの進捗(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
— Ryuichi Ueda (@ueda.tech) 2025年4月15日 17:24
[image or embed]
通ったテストは、
- 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
— Ryuichi Ueda (@ueda.tech) 2025年4月9日 18:03
[image or embed]
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
が標準入力を読む前に、続きのシェルスクリプトを読んでしまうというアホみたいなバグで、すぐ除去しました。
いやーこわいこわい。現場からは以上です。