End-Of-String charを使用する$'\x01'
と、Bash正規表現は正しく比較されません。$
他のすべてのバイト値は正しく比較されるようです。
GNU bash 4.1.5(1) を使用。これはバグですか、それともこれに16進表記でバイトを表示する他の方法はありますか$'\...'
? ...しかし、リテラル文字とリテラル文字の比較も失敗するので、シンボルではないようです。
$'\x01'
この「失敗」は、End-Of-Stringの直前にある場合にのみ発生します$
。
ここにいくつかの例があります。
echo 'non \x01 with ^ and $'
[[ 3 =~ ^$'\x33'$ ]]; echo $? # 0
[[ 3 =~ ^$'\063'$ ]]; echo $? # 0
[[ $'\x12' =~ ^$'\x12'$ ]]; echo $? # 0
[[ $'\002' =~ ^$'\x02'$ ]]; echo $? # 0
echo '\x01 with no ^ or $'
[[ $'\x01' =~ $'\x01' ]]; echo $? # 0
[[ $'\x01' =~ $'\001' ]]; echo $? # 0
[[ =~ $'\001' ]]; echo $? # 0 nb. Literal char does not render
[[ =~ ]]; echo $? # 0 nb. Literal char does not render
echo '\x01 with ^ only'
[[ $'\x01' =~ ^$'\x01' ]]; echo $? # 0
[[ $'\x01' =~ ^$'\001' ]]; echo $? # 0
[[ =~ ^$'\001' ]]; echo $? # 0 nb. Literal char does not render
[[ =~ ^ ]]; echo $? # 0 nb. Literal char does not render
echo '\x01 with ^ and $'
[[ $'\x01' =~ ^$'\x01'$ ]]; echo $? # 1
[[ $'\x01' =~ ^$'\001'$ ]]; echo $? # 1
[[ =~ ^$'\001'$ ]]; echo $? # 1 nb. Literal char does not render
[[ =~ ^$ ]]; echo $? # 1 nb. Literal char does not render
echo '\x01 with $ only'
[[ $'\x01' =~ $'\x01'$ ]]; echo $? # 1
[[ $'\x01' =~ $'\001'$ ]]; echo $? # 1
[[ =~ $'\001'$ ]]; echo $? # 1 nb. Literal char does not render
[[ =~ $ ]]; echo $? # 1 nb. Literal char does not render
echo '\x01 with $ only, but not adjacent to \x01'
[[ $'\x01'c =~ $'\x01'c$ ]]; echo $? # 0
[[ $'\x01'c =~ $'\001'c$ ]]; echo $? # 0
[[ c =~ $'\001'c$ ]]; echo $? # 0 nb. Literal char does not render
[[ c =~ c$ ]]; echo $? # 0 nb. Literal char does not render
答え1
はい、これは以前のバージョンのバグであり、bash
bash-4.2.14で修正されました。
これは問題を解決するコミット;必要に応じて使用してください。
何ですかCTLESC
?ご覧のとおり、syntax.h
次のように定義されています。#define CTLESC '\001'
拡張に関連する一種の内部脱出です。\x01
データが内部的に生成されたかのように解釈されるのはエラーのようですCTLESC
。
commit 25db9a70d4c2ba5c43d4167f231bdd8d760d5a06
Author: Chet Ramey <[email protected]>
Date: Tue Nov 22 20:02:46 2011 -0500
Bash-4.2 patch 14
diff --git a/patchlevel.h b/patchlevel.h
index 636be1c..04b423b 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 13
+#define PATCHLEVEL 14
#endif /* _PATCHLEVEL_H_ */
diff --git a/pathexp.c b/pathexp.c
index 42f21e4..f239956 100644
--- a/pathexp.c
+++ b/pathexp.c
@@ -196,7 +196,7 @@ quote_string_for_globbing (pathname, qflags)
{
if ((qflags & QGLOB_FILENAME) && pathname[i+1] == '/')
continue;
- if ((qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0)
+ if (pathname[i+1] != CTLESC && (qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0)
continue;
temp[j++] = '\\';
i++;