summaryrefslogtreecommitdiff
path: root/src/proxy.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2024-09-22 00:31:11 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2024-09-29 19:33:42 +0900
commit4161403a1d6286f6ba7898b1f22f30d01d85b8dc (patch)
tree539b7b985c0b9afe681f6cd60e2d37b0415f00a2 /src/proxy.go
parent53bcdc4294540fa8d927a5532cc7ac0aa58e3487 (diff)
downloadfzf-4161403a1d6286f6ba7898b1f22f30d01d85b8dc.tar.gz
--tmux: Export bash functions
Fix #4001
Diffstat (limited to 'src/proxy.go')
-rw-r--r--src/proxy.go22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/proxy.go b/src/proxy.go
index d53805b1..caddee48 100644
--- a/src/proxy.go
+++ b/src/proxy.go
@@ -9,6 +9,7 @@ import (
"os/exec"
"os/signal"
"path/filepath"
+ "regexp"
"strings"
"time"
@@ -32,7 +33,7 @@ func fifo(name string) (string, error) {
return output, nil
}
-func runProxy(commandPrefix string, cmdBuilder func(temp string) *exec.Cmd, opts *Options, withExports bool) (int, error) {
+func runProxy(commandPrefix string, cmdBuilder func(temp string, needBash bool) (*exec.Cmd, error), opts *Options, withExports bool) (int, error) {
output, err := fifo("proxy-output")
if err != nil {
return ExitError, err
@@ -92,17 +93,28 @@ func runProxy(commandPrefix string, cmdBuilder func(temp string) *exec.Cmd, opts
// To ensure that the options are processed by a POSIX-compliant shell,
// we need to write the command to a temporary file and execute it with sh.
var exports []string
+ needBash := false
if withExports {
- exports = os.Environ()
- for idx, pairStr := range exports {
+ validIdentifier := regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_]*$`)
+ for _, pairStr := range os.Environ() {
pair := strings.SplitN(pairStr, "=", 2)
- exports[idx] = fmt.Sprintf("export %s=%s", pair[0], escapeSingleQuote(pair[1]))
+ if validIdentifier.MatchString(pair[0]) {
+ exports = append(exports, fmt.Sprintf("export %s=%s", pair[0], escapeSingleQuote(pair[1])))
+ } else if strings.HasPrefix(pair[0], "BASH_FUNC_") && strings.HasSuffix(pair[0], "%%") {
+ name := pair[0][10 : len(pair[0])-2]
+ exports = append(exports, name+pair[1])
+ exports = append(exports, "export -f "+name)
+ needBash = true
+ }
}
}
temp := WriteTemporaryFile(append(exports, command), "\n")
defer os.Remove(temp)
- cmd := cmdBuilder(temp)
+ cmd, err := cmdBuilder(temp, needBash)
+ if err != nil {
+ return ExitError, err
+ }
cmd.Stderr = os.Stderr
intChan := make(chan os.Signal, 1)
defer close(intChan)