@@ -29,20 +29,33 @@ func exportify(vars map[string]string) string {
29
29
slices .Sort (keys ) // for reproducibility
30
30
31
31
strb := strings.Builder {}
32
- for _ , k := range keys {
33
- strb .WriteString ("export " )
34
- strb .WriteString (k )
35
- strb .WriteString (`="` )
36
- for _ , r := range vars [k ] {
37
- switch r {
38
- // Special characters inside double quotes:
39
- // https://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html#tag_02_02_03
40
- case '$' , '`' , '"' , '\\' , '\n' :
41
- strb .WriteRune ('\\' )
32
+ for _ , key := range keys {
33
+ if strings .HasPrefix (key , "BASH_FUNC_" ) && strings .HasSuffix (key , "%%" ) {
34
+ // Bash function
35
+ funcName := strings .TrimSuffix (key , "%%" )
36
+ funcName = strings .TrimPrefix (funcName , "BASH_FUNC_" )
37
+ strb .WriteString (funcName )
38
+ strb .WriteString (" " )
39
+ strb .WriteString (vars [key ])
40
+ strb .WriteString ("\n export -f " )
41
+ strb .WriteString (funcName )
42
+ strb .WriteString ("\n " )
43
+ } else {
44
+ // Regular variable
45
+ strb .WriteString ("export " )
46
+ strb .WriteString (key )
47
+ strb .WriteString (`="` )
48
+ for _ , r := range vars [key ] {
49
+ switch r {
50
+ // Special characters inside double quotes:
51
+ // https://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html#tag_02_02_03
52
+ case '$' , '`' , '"' , '\\' , '\n' :
53
+ strb .WriteRune ('\\' )
54
+ }
55
+ strb .WriteRune (r )
42
56
}
43
- strb .WriteRune ( r )
57
+ strb .WriteString ( " \" ; \n " )
44
58
}
45
- strb .WriteString ("\" ;\n " )
46
59
}
47
60
return strings .TrimSpace (strb .String ())
48
61
}
0 commit comments