自作シェルの進捗とBashの細かい話(2024年7月27日)
Sat Jul 27 10:14:16 JST 2024 (modified: Sat Jul 27 10:43:44 JST 2024)
views: 3101, keywords:自作シェル, 寿司シェル, sush
自作シェルの開発の進捗報告なんですけど、前回の報告が6月9日でどんだけ報告さぼってたんか。
6月以降のリリース
6月20日から、真面目にGitHub上にリリースを残すようにしました(ここ)。今日までのリリースはこんな感じ。
- v0.3.5: なにも入力しないでタブ補完しようとしたら、ヒストリーを一覧表示するようにした。
- v0.3.6: 改行のあるコマンドのヒストリーが
~/.sush_history
にきれいに保存されるように細工。 - v0.3.7: 拡張グロブがファイルパスの展開で使用できるように、グロブを自作のものに切り替え。
- v0.3.9: バグフィックス
- v0.4.0:
- Ctrl+Zでフォアグラウンドプロセスを停止できるようにした。
- jobs, wait, bgを雑に実装
- v0.4.4: fgコマンドの実装(必要最低限)
- v0.4.5: GNOME-terminalのタイトルにプロンプトの内容を表示できるようにした。
- v0.4.6: evalの実装
- v0.4.7: unsetの実装
- v0.4.9:
${変数:-代替の単語}
の実装(:=
、:?
、:+
も) - v0.4.11: Bashの変な挙動を模倣
- 変な挙動: 変数の参照において、たとえば
echo ${BASH_VERSION-aaaaa}
など-
の後ろになにか書いてもエラーを起こさない
- 変な挙動: 変数の参照において、たとえば
- v0.5.0:
echo ${変数:-"文字列"}
とecho ${変数:="文字列"}
について、文字列途中に改行がある場合、Bashだと出力が変わる挙動を再現:-
の場合は改行がそのまま出力され、:=
の場合は改行がなくなる(後述)。
- v0.5.2:
shopt
のextglob
を実装 - v0.5.3: Bashのオプション
-x
と-v
の実装 - v0.5.4: Bashのオプション
-e
の実装 - v0.5.5: Bashのオプション
-o pipefail
の実装 - v0.5.6:
$(( ))
と、そのなかでの四則演算の実装
v0.5.0の挙動について
リリースにもありますが、次のような違いが出ます。
unset A
$ echo ${A:-"aaa
$ bbb"}
aaa #改行が残る
bbb
unset A
$ echo ${A:="aaa
$ bbb"}
aaa bbb #改行が残らない
:-
の場合は"aaa改行bbb"
がそのままecho
の引数として置き換わるので、ダブルクォートの中の改行として改行がそのまま出力されます。一方:=
の場合は、一度変数A
にaaa改行bbb
が代入されてから評価されるので、ダブルクォートが消失して、改行が単語の切れ目としてスペースに代わります。・・・実装するまで知らなかったよ。細かい・・・
現場からは以上です。こんなにひとりで突っ走ってたら誰も手伝ってはくれんよなあ・・・。自分の弱点。