by shigemk2

当面は技術的なことしか書かない

AOSA 3 The Bourne-Again Shell その4 #read_aosa

  • パースが終わったら、実行の前に、パース段階で生成された単語の多くを展開することになる。つまり、(たとえば)$OSTYPEを文字列"linux-gnu"に置き換えたりするような処理だ
  • 変数は、わずかな例外を除いて文字列として扱われる(型付けが存在しない)
  • シンタックスシュガー

展開方法

(特殊なやつ) * チルダ * $(())

$ echo pre{one,two,three}post
preonepost pretwopost prethreepost
 diff <(ls -a README.md) <(ls -a README2.md)
1c1
< README.md
---
> README2.md

単語の分割→グロブ→実装

実装

  • シェルの基本構造がパイプラインにそったものなら、単語の展開は自分自身に向けた小さなパイプラインとなる(という基本の設計思想)
  • 単語の展開における各ステージは、単語を受け取って何らかの変換を施し、それを次の展開ステージに渡す。すべての単語展開が終わったら、コマンドを実行する
  • ユーザーの都合に合わせて機能を追加していくと設計がぐちゃぐちゃになる
  • パーサと同様、単語展開のコードもマルチバイト文字を正しく扱うことができる。たとえば、変数の長さの展開($#variable)は、バイト数ではなく文字数を数える。展開のコードは、展開の終わりやマルチバイト文字列で特別な意味を持つ文字を正しく識別する

m-takagi/aosa-ja · GitHub