From ee40212e9772941b49a4bdb1e95f99913cdea469 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 28 Sep 2017 23:05:02 +0900 Subject: [PATCH] Update FZF_DEFAULT_COMMAND - Use bash for `set -o pipefail` - Fall back to simpler find command when the original command failed Related: #1061 --- src/constants.go | 2 +- src/reader.go | 10 ++++++---- src/reader_test.go | 4 ++-- src/util/util_unix.go | 5 +++++ src/util/util_windows.go | 8 +++++++- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/constants.go b/src/constants.go index cfd3a3bc0fc..d544529929d 100644 --- a/src/constants.go +++ b/src/constants.go @@ -55,7 +55,7 @@ var defaultCommand string func init() { if !util.IsWindows() { - defaultCommand = `command find -L . -mindepth 1 \( -path '*/\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \) -prune -o -type f -print -o -type l -print 2> /dev/null | cut -b3-` + defaultCommand = `set -o pipefail; (command find -L . -mindepth 1 \( -path '*/\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \) -prune -o -type f -print -o -type l -print || command find -L . -mindepth 1 -path '*/\.*' -prune -o -type f -print -o -type l -print) 2> /dev/null | cut -b3-` } else if os.Getenv("TERM") == "cygwin" { defaultCommand = `sh -c "command find -L . -mindepth 1 -path '*/\.*' -prune -o -type f -print -o -type l -print 2> /dev/null | cut -b3-"` } else { diff --git a/src/reader.go b/src/reader.go index 22ce4ba044d..5fd6d876ece 100644 --- a/src/reader.go +++ b/src/reader.go @@ -56,9 +56,11 @@ func (r *Reader) ReadSource() { if util.IsTty() { cmd := os.Getenv("FZF_DEFAULT_COMMAND") if len(cmd) == 0 { - cmd = defaultCommand + // The default command for *nix requires bash + success = r.readFromCommand("bash", defaultCommand) + } else { + success = r.readFromCommand("sh", cmd) } - success = r.readFromCommand(cmd) } else { success = r.readFromStdin() } @@ -100,8 +102,8 @@ func (r *Reader) readFromStdin() bool { return true } -func (r *Reader) readFromCommand(cmd string) bool { - listCommand := util.ExecCommand(cmd) +func (r *Reader) readFromCommand(shell string, cmd string) bool { + listCommand := util.ExecCommandWith(shell, cmd) out, err := listCommand.StdoutPipe() if err != nil { return false diff --git a/src/reader_test.go b/src/reader_test.go index 82ca6b7b46a..c29936ce6d8 100644 --- a/src/reader_test.go +++ b/src/reader_test.go @@ -23,7 +23,7 @@ func TestReadFromCommand(t *testing.T) { } // Normal command - reader.fin(reader.readFromCommand(`echo abc && echo def`)) + reader.fin(reader.readFromCommand("sh", `echo abc && echo def`)) if len(strs) != 2 || strs[0] != "abc" || strs[1] != "def" { t.Errorf("%s", strs) } @@ -48,7 +48,7 @@ func TestReadFromCommand(t *testing.T) { reader.startEventPoller() // Failing command - reader.fin(reader.readFromCommand(`no-such-command`)) + reader.fin(reader.readFromCommand("sh", `no-such-command`)) strs = []string{} if len(strs) > 0 { t.Errorf("%s", strs) diff --git a/src/util/util_unix.go b/src/util/util_unix.go index d538ee001b1..fc63c02782f 100644 --- a/src/util/util_unix.go +++ b/src/util/util_unix.go @@ -14,6 +14,11 @@ func ExecCommand(command string) *exec.Cmd { if len(shell) == 0 { shell = "sh" } + return ExecCommandWith(shell, command) +} + +// ExecCommandWith executes the given command with the specified shell +func ExecCommandWith(shell string, command string) *exec.Cmd { return exec.Command(shell, "-c", command) } diff --git a/src/util/util_windows.go b/src/util/util_windows.go index efd19a2af10..493f4d7fe4f 100644 --- a/src/util/util_windows.go +++ b/src/util/util_windows.go @@ -10,8 +10,14 @@ import ( "github.com/mattn/go-shellwords" ) -// ExecCommand executes the given command with $SHELL +// ExecCommand executes the given command with cmd func ExecCommand(command string) *exec.Cmd { + return ExecCommandWith("cmd", command) +} + +// ExecCommandWith executes the given command with cmd. _shell parameter is +// ignored on Windows. +func ExecCommandWith(_shell string, command string) *exec.Cmd { args, _ := shellwords.Parse(command) allArgs := make([]string, len(args)+1) allArgs[0] = "/c"