← Commit list

fa82ef1a2

Denys Vlasenko
Denys Vlasenko
2025-08-09
SUCCESS Duration: 171s

Subject

shells: add testsuite item

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash_test/ash-vars/var_backslash1.right+25 -0
@@ -0,0 +1,25 @@
+a is '\*bc'
+b is '\'
+c is '*'
+${a##?*} removes everything: ||
+${a##?"*"} removes \*: |bc| - matches one char, then *
+${a##\*} removes nothing: |\*bc| - first char is not *
+${a##\\*} removes everything: || - matches \, then all
+${a##\\\*} removes \*: || - matches \, then *
+${a##?$c} removes everything: || - matches one char, then all
+${a##?"$c"} removes \*: |bc| - matches one char, then *
+${a##\\$c} removes everything: || - matches \, then all
+${a##\\"$c"} removes \*: |bc| - matches \, then *
+${a##$b} removes \: |*bc| - matches \
+${a##"$b"} removes \: |*bc| - matches \
+
+${a##"$b"?} removes \*: |bc| - matches \, then one char
+${a##"$b"*} removes everything: || - matches \, then all
+${a##"$b""?"} removes nothing: |\*bc| - second char is not ?
+${a##"$b""*"} removes \*: |bc| - matches \, then *
+${a##"$b"\*} removes \*: |bc| - matches \, then *
+${a##"$b"$c} removes everything:|| - matches \, then all
+${a##"$b""$c"} removes \*: |bc| - matches \, then *
+${a##"$b?"} removes nothing: |\*bc| - second char is not ?
+${a##"$b*"} removes \*: |bc| - matches \, then *
+${a##"$b$c"} removes \*: |bc| - matches \, then *
shell/ash_test/ash-vars/var_backslash1.tests+37 -0
@@ -0,0 +1,37 @@
+a='\*bc'
+b='\'
+c='*'
+echo "a is '$a'"
+echo "b is '$b'"
+echo "c is '$c'"
+echo '${a##?*} removes everything: '"|${a##?*}|"
+echo '${a##?"*"} removes \*: '"|${a##?"*"}|"' - matches one char, then *'
+echo '${a##\*} removes nothing: '"|${a##\*}|"' - first char is not *'
+echo '${a##\\*} removes everything: '"|${a##\\*}|"' - matches \, then all'
+echo '${a##\\\*} removes \*: '"|${a##\\*}|"' - matches \, then *'
+echo '${a##?$c} removes everything: '"|${a##?$c}|"' - matches one char, then all'
+echo '${a##?"$c"} removes \*: '"|${a##?"$c"}|"' - matches one char, then *'
+echo '${a##\\$c} removes everything: '"|${a##\\$c}|"' - matches \, then all'
+echo '${a##\\"$c"} removes \*: '"|${a##\\"$c"}|"' - matches \, then *'
+echo '${a##$b} removes \: '"|${a##$b}|"' - matches \'
+echo '${a##"$b"} removes \: '"|${a##"$b"}|"' - matches \'
+echo
+## In bash, this isn't working as expected
+#echo '${a##$b?} removes \*: '"|${a##$b?}|"' - matches \, then one char' # bash prints |\*bc|
+#echo '${a##$b*} removes everything: '"|${a##$b*}|"' - matches \, then all' # bash prints |\*bc|
+#echo '${a##$b$c} removes everything: '"|${a##$b$c}|"' - matches \, then all' # bash prints |\*bc|
+#echo '${a##$b"$c"} removes \*: '"|${a##$b"$c"}|"' - matches \, then *' # bash prints |\*bc|
+## the cause seems to be that $b emits backslash that "glues" onto next character if there is one:
+## a='\*bc'; b='\'; c='*'; echo "|${a##?$b*}|" # bash prints |bc| - the $b* works as \* (matches literal *)
+## a='\*bc'; b='\'; c='*'; echo "|${a##\\$b*}|" # bash prints |bc|
+#echo
+echo '${a##"$b"?} removes \*: '"|${a##"$b"?}|"' - matches \, then one char'
+echo '${a##"$b"*} removes everything: '"|${a##"$b"*}|"' - matches \, then all'
+echo '${a##"$b""?"} removes nothing: '"|${a##"$b""?"}|"' - second char is not ?' # bash prints |bc|
+echo '${a##"$b""*"} removes \*: '"|${a##"$b""*"}|"' - matches \, then *'
+echo '${a##"$b"\*} removes \*: '"|${a##"$b"\*}|"' - matches \, then *'
+echo '${a##"$b"$c} removes everything:'"|${a##"$b"$c}|"' - matches \, then all'
+echo '${a##"$b""$c"} removes \*: '"|${a##"$b""$c"}|"' - matches \, then *'
+echo '${a##"$b?"} removes nothing: '"|${a##"$b?"}|"' - second char is not ?' # bash prints |bc|
+echo '${a##"$b*"} removes \*: '"|${a##"$b*"}|"' - matches \, then *' # bash prints ||
+echo '${a##"$b$c"} removes \*: '"|${a##"$b$c"}|"' - matches \, then *'
shell/hush_test/hush-bugs/var_backslash1.right+25 -0
@@ -0,0 +1,25 @@
+a is '\*bc'
+b is '\'
+c is '*'
+${a##?*} removes everything: ||
+${a##?"*"} removes \*: |bc| - matches one char, then *
+${a##\*} removes nothing: |\*bc| - first char is not *
+${a##\\*} removes everything: || - matches \, then all
+${a##\\\*} removes \*: || - matches \, then *
+${a##?$c} removes everything: || - matches one char, then all
+${a##?"$c"} removes \*: |bc| - matches one char, then *
+${a##\\$c} removes everything: || - matches \, then all
+${a##\\"$c"} removes \*: |bc| - matches \, then *
+${a##$b} removes \: |*bc| - matches \
+${a##"$b"} removes \: |*bc| - matches \
+
+${a##"$b"?} removes \*: |bc| - matches \, then one char
+${a##"$b"*} removes everything: || - matches \, then all
+${a##"$b""?"} removes nothing: |\*bc| - second char is not ?
+${a##"$b""*"} removes \*: |bc| - matches \, then *
+${a##"$b"\*} removes \*: |bc| - matches \, then *
+${a##"$b"$c} removes everything:|| - matches \, then all
+${a##"$b""$c"} removes \*: |bc| - matches \, then *
+${a##"$b?"} removes nothing: |\*bc| - second char is not ?
+${a##"$b*"} removes \*: |bc| - matches \, then *
+${a##"$b$c"} removes \*: |bc| - matches \, then *
shell/hush_test/hush-bugs/var_backslash1.tests+37 -0
@@ -0,0 +1,37 @@
+a='\*bc'
+b='\'
+c='*'
+echo "a is '$a'"
+echo "b is '$b'"
+echo "c is '$c'"
+echo '${a##?*} removes everything: '"|${a##?*}|"
+echo '${a##?"*"} removes \*: '"|${a##?"*"}|"' - matches one char, then *'
+echo '${a##\*} removes nothing: '"|${a##\*}|"' - first char is not *'
+echo '${a##\\*} removes everything: '"|${a##\\*}|"' - matches \, then all'
+echo '${a##\\\*} removes \*: '"|${a##\\*}|"' - matches \, then *'
+echo '${a##?$c} removes everything: '"|${a##?$c}|"' - matches one char, then all'
+echo '${a##?"$c"} removes \*: '"|${a##?"$c"}|"' - matches one char, then *'
+echo '${a##\\$c} removes everything: '"|${a##\\$c}|"' - matches \, then all'
+echo '${a##\\"$c"} removes \*: '"|${a##\\"$c"}|"' - matches \, then *'
+echo '${a##$b} removes \: '"|${a##$b}|"' - matches \'
+echo '${a##"$b"} removes \: '"|${a##"$b"}|"' - matches \'
+echo
+## In bash, this isn't working as expected
+#echo '${a##$b?} removes \*: '"|${a##$b?}|"' - matches \, then one char' # bash prints |\*bc|
+#echo '${a##$b*} removes everything: '"|${a##$b*}|"' - matches \, then all' # bash prints |\*bc|
+#echo '${a##$b$c} removes everything: '"|${a##$b$c}|"' - matches \, then all' # bash prints |\*bc|
+#echo '${a##$b"$c"} removes \*: '"|${a##$b"$c"}|"' - matches \, then *' # bash prints |\*bc|
+## the cause seems to be that $b emits backslash that "glues" onto next character if there is one:
+## a='\*bc'; b='\'; c='*'; echo "|${a##?$b*}|" # bash prints |bc| - the $b* works as \* (matches literal *)
+## a='\*bc'; b='\'; c='*'; echo "|${a##\\$b*}|" # bash prints |bc|
+#echo
+echo '${a##"$b"?} removes \*: '"|${a##"$b"?}|"' - matches \, then one char'
+echo '${a##"$b"*} removes everything: '"|${a##"$b"*}|"' - matches \, then all'
+echo '${a##"$b""?"} removes nothing: '"|${a##"$b""?"}|"' - second char is not ?' # bash prints |bc|
+echo '${a##"$b""*"} removes \*: '"|${a##"$b""*"}|"' - matches \, then *'
+echo '${a##"$b"\*} removes \*: '"|${a##"$b"\*}|"' - matches \, then *'
+echo '${a##"$b"$c} removes everything:'"|${a##"$b"$c}|"' - matches \, then all'
+echo '${a##"$b""$c"} removes \*: '"|${a##"$b""$c"}|"' - matches \, then *'
+echo '${a##"$b?"} removes nothing: '"|${a##"$b?"}|"' - second char is not ?' # bash prints |bc|
+echo '${a##"$b*"} removes \*: '"|${a##"$b*"}|"' - matches \, then *' # bash prints ||
+echo '${a##"$b$c"} removes \*: '"|${a##"$b$c"}|"' - matches \, then *'