@@ -29,20 +29,33 @@ func exportify(vars map[string]string) string {
2929 slices .Sort (keys ) // for reproducibility
3030
3131 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 )
4256 }
43- strb .WriteRune ( r )
57+ strb .WriteString ( " \" ; \n " )
4458 }
45- strb .WriteString ("\" ;\n " )
4659 }
4760 return strings .TrimSpace (strb .String ())
4861}
0 commit comments