使用 FZF 列出 git 个按日期排序的文件(并在 bash 中设置默认值)

Use FZF to list git files sorted by date (and set default in bash)

我想使用 fzf 列出 git 中的所有文件,按修改日期排序。 (我在 vim 中使用此输出)

这个命令似乎有效:

(while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n | awk {"print $3"}) 2> /dev/nul

但是我怎样才能将它作为默认的 FZF 命令呢? 我试过了,但是变量 FZF_DEFAULT_COMMAND 仍然是空的:

export FZF_DEFAULT_COMMAND='
    (while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n | awk {"print $3"}) 2> /dev/null'

也许我需要逃避什么?

编辑: 这是我现在使用的命令:

export FZF_DEFAULT_COMMAND='(git ls-tree -r --name-only HEAD)|(while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- "$file") $file; done | sort -r | awk {"print $3"}) 2> /dev/null'

fzf 使用 /bin/sh (Posix shell) 来执行你的命令。即使 /bin/sh 链接到 /bin/bash 它也会在非 posix 功能上失败(比如你的情况下的进程替换)。您可以强制执行 GNU/bash 支持:

export FZF_DEFAULT_COMMAND='set +o posix
    (while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n | awk {"print $3"}) 2> /dev/null'

如果你没有 bash 符号链接到 /bin/sh,你必须去掉进程替换:

export FZF_DEFAULT_COMMAND='
    (git ls-tree -r --name-only HEAD)|(while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done | sort -k1,1n | awk {"print $3"}) 2> /dev/null'