0

我想使用 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'
4

1 回答 1

1

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'
于 2018-06-22T08:43:38.710 回答