鯉江@koie@satoh_fumiyasu caseのマッチとremove prefixでdashがほかの人と挙動がちがうです。エスケープしないとダメ?
2016/01/29 14:12:41
https://t.co/TXh5mDCjfv
#!/bin/sh X='[foo' case "$X" in [*) echo match;; *) echo unmatch;; esac echo "remove prefix: '${X#[}'"
case | remove prefix | |
---|---|---|
bash | match | 'foo' |
ash | match | 'foo' |
dash | unmatch | '[foo' |
ksh | unmatch | 'foo' |
zsh | bad pattern: [* | bad pattern: [ ' |
パターンのところに閉じ括弧のない [ がきたら [ にマッチしてほしい、じゃなかったら構文エラーじゃないか?ということからいろいろ議論が発展したが、どうやら単独の[は[自身にマッチすると言う記述はあるらしい。単独じゃない[については議論の終着点がよくわからん。
でdashだけ挙動がおかしいのでソースコードをみてみたら、どうもバグってるんじゃないか?こんな感じのパッチを当てたら[自身にマッチするようになった。
--- dash-0.5.8-orig/src/expand.c 2014-09-28 17:19:32.000000000 +0900 +++ dash-0.5.8-koie/src/expand.c 2016-01-31 23:40:13.903174483 +0900 @@ -1549,7 +1549,8 @@ pmatch(const char *pattern, const char * do { if (!c) { p = startp; - c = *p; + c = p[-1]; + q--; goto dft; } if (c == '[') {