git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] test-lib: check Bash version for '-x' without using shell arrays

From
SZEDER Gábor <szeder.dev@gmail.com>
Date
Jan 1, 2019, 23:19 UTC
Message-ID
<20190101231949.8184-1-szeder.dev@gmail.com>

One of our test scripts, 't1510-repo-setup.sh' [1], still can't be reliably run with '-x' tracing enabled, unless it's executed with a Bash version supporting BASH_XTRACEFD (since v4.1). We have a lengthy condition to check the version of the shell running the test script, and disable tracing if it's not executed with a suitable Bash version [2].

This condition uses non-portable shell array accesses to easily get Bash's major and minor version number. This didn't seem to be problematic, because the simple commands expanding those array accesses are only executed when the test script is actually run with Bash. When run with Dash, the only shell I have at hand that doesn't support shell arrays, there are no issues, as it apparently skips right over the non-executed simple commands without noticing the non-supported constructs.

Alas, it has been reported that NetBSD's /bin/sh does complain about them:

  ./test-lib.sh: 327: Syntax error: Bad substitution
where line 327 contains the first ${BASH_VERSINFO[0]} array access.

To my understanding both shells are right and conform to POSIX, because the standard allows both behavior by stating the following under '2.8.1 Consequences of Shell Errors':

  "An expansion error is one that occurs when the shell expansions
  define in wordexp are carried out (for example, "${x!y}", because
  '!' is not a valid operator); an implementation may treat these as
  syntax errors if it is able to detect them during tokenization,
  rather than during expansion."

Avoid this issue with NetBSD's /bin/sh (and potentially with other, less common shells) by using a couple of parameter expansions to extract the major and minor version numbers from $BASH_VERSION.

[1] 5827506928 (t1510-repo-setup: mark as untraceable with '-x',
    2018-02-24)
[2] 5fc98e79fc (t: add means to disable '-x' tracing for individual
    test scripts, 2018-02-24)
Reported-by: Max Kirillov <max@max630.net>
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
---

This will certainly conflict with patches 3 and 6 in my stress testing patch series at

  https://public-inbox.org/git/20181230191629.3232-1-szeder.dev@gmail.com/T/#u
 t/test-lib.sh | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 0f1faa24b2..f47a191e3b 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -324,9 +324,12 @@ do
 		# isn't executed with a suitable Bash version.
 		if test -z "$test_untraceable" || {
 		     test -n "$BASH_VERSION" && {
-		       test ${BASH_VERSINFO[0]} -gt 4 || {
-			 test ${BASH_VERSINFO[0]} -eq 4 &&
-			 test ${BASH_VERSINFO[1]} -ge 1
+		       bash_major=${BASH_VERSION%%.*}
+		       bash_minor=${BASH_VERSION#*.}
+		       bash_minor=${bash_minor%%.*}
+		       test $bash_major -gt 4 || {
+			 test $bash_major -eq 4 &&
+			 test $bash_minor -ge 1
 		       }
 		     }
 		   }
-- 
2.20.1.151.gec613c4b75
Next: Johannes Sixt
Message 1 of 14 in “test-lib: check Bash version for '-x' without using shell arrays”
  1. test-lib: check Bash version for '-x' without using shell arraysSZEDER Gábor, Jan 1, 2019
  2. Johannes SixtJan 2, 2019
  3. Junio C HamanoJan 2, 2019
  4. test-lib: check Bash version for '-x' without using shell arraysSZEDER Gábor, Jan 3, 2019
  5. Junio C HamanoJan 3, 2019
  6. SZEDER GáborJan 4, 2019
  7. Junio C HamanoJan 4, 2019
  8. SZEDER GáborJan 4, 2019
  9. Carlo ArenasJan 4, 2019
  10. Junio C HamanoJan 4, 2019
  11. Jeff KingJan 3, 2019
  12. Eric SunshineJan 2, 2019
  13. Carlo ArenasJan 2, 2019
  14. SZEDER GáborJan 3, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.