鯉江@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 == '[') {
















