From b7cda183db28ff123b43fd80841ca184b111e400 Mon Sep 17 00:00:00 2001 From: Adrian Grucza Date: Tue, 6 May 2025 21:01:25 +1000 Subject: [PATCH] [envvars] Fix error when env contains Bash function --- internal/devbox/envvars.go | 37 +++++++++++++------ internal/devbox/testdata/shellrc/basic/env | 1 + .../testdata/shellrc/basic/shellrc.golden | 2 + 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/internal/devbox/envvars.go b/internal/devbox/envvars.go index 3eb034e3f34..996454ea683 100644 --- a/internal/devbox/envvars.go +++ b/internal/devbox/envvars.go @@ -29,20 +29,33 @@ func exportify(vars map[string]string) string { slices.Sort(keys) // for reproducibility strb := strings.Builder{} - for _, k := range keys { - strb.WriteString("export ") - strb.WriteString(k) - strb.WriteString(`="`) - for _, r := range vars[k] { - switch r { - // Special characters inside double quotes: - // https://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html#tag_02_02_03 - case '$', '`', '"', '\\', '\n': - strb.WriteRune('\\') + for _, key := range keys { + if strings.HasPrefix(key, "BASH_FUNC_") && strings.HasSuffix(key, "%%") { + // Bash function + funcName := strings.TrimSuffix(key, "%%") + funcName = strings.TrimPrefix(funcName, "BASH_FUNC_") + strb.WriteString(funcName) + strb.WriteString(" ") + strb.WriteString(vars[key]) + strb.WriteString("\nexport -f ") + strb.WriteString(funcName) + strb.WriteString("\n") + } else { + // Regular variable + strb.WriteString("export ") + strb.WriteString(key) + strb.WriteString(`="`) + for _, r := range vars[key] { + switch r { + // Special characters inside double quotes: + // https://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html#tag_02_02_03 + case '$', '`', '"', '\\', '\n': + strb.WriteRune('\\') + } + strb.WriteRune(r) } - strb.WriteRune(r) + strb.WriteString("\";\n") } - strb.WriteString("\";\n") } return strings.TrimSpace(strb.String()) } diff --git a/internal/devbox/testdata/shellrc/basic/env b/internal/devbox/testdata/shellrc/basic/env index ff3064c8503..19f513577a5 100644 --- a/internal/devbox/testdata/shellrc/basic/env +++ b/internal/devbox/testdata/shellrc/basic/env @@ -2,3 +2,4 @@ simple=value space=quote me quote=they said, "lasers" special=$`"\ +BASH_FUNC_echo_simple%%=() { echo "${simple}"; } diff --git a/internal/devbox/testdata/shellrc/basic/shellrc.golden b/internal/devbox/testdata/shellrc/basic/shellrc.golden index 19e5813c67f..45a901c3a5e 100644 --- a/internal/devbox/testdata/shellrc/basic/shellrc.golden +++ b/internal/devbox/testdata/shellrc/basic/shellrc.golden @@ -3,6 +3,8 @@ if [ -f testdata/shellrc/basic/shellrc ]; then fi # Begin Devbox Post-init Hook +echo_simple () { echo "${simple}"; } +export -f echo_simple export quote="they said, \"lasers\""; export simple="value"; export space="quote me";