fzdwx

fzdwx

Hello , https://github.com/fzdwx

在執行cd後改變主要shell的路徑的shell腳本中

起因#

昨天晚上想用 fzf 与 cd 联动,就是 fzf 的结果传递给 cd 来执行于是有了这么一条命令:

cd $(fd --type d | fzf)

这个命令也确实能完成任务,但是问题有两个:

  1. 如果直接退出的话会回到家目录,因为$(..)的执行结果为空
  2. 每次都要输入这么多会很麻烦

用 alias#

然后尝试用 alias 来试试,所以就往.zshrc里面添加:

alias cdf="cd $(fd --type d | fzf)"

结果是直接不能运行,因为它直接识别了$(..)这一段,然后直接运行了,但是后面就不会运行.

用 shell 脚本#

然后就写了这个文件:

#!/bin/sh
path=$(fd --type d --strip-cwd-prefix --hidden --follow --exclude .git --exclude node_modules | fzf)

if [ -z "$path" ]; then
    exit
fi

cd "$path" || exit

结果也是不行,后面我在最下面加了一行echo "$PWD",我看到是执行了的,但是程序退出了就失效了.

解决#

最后我搜索到可以使用source xxx或者. xxx来解决,最后是 alias+shell 脚本来完成这个操作的:

alias cdf="source /path/to/cdf"

同时它也解决我上面提到的两个问题.

source 为什么能解决?#

之所以直接用 shell 脚本直接运行会不行,是因为它不是在当前 shell 环境中运行的,而是一个子 shell,所以结果就不能改变当前的文件目录了.

source或者.就代表着在当前的 shell 环境中执行,所以就能成功.

更新#

2022/11/18#

今天发现一种更容易解决的办法,就是在写一个 shell 方法:

function cd() {
    cd "$(fzf)"
}

把它加入到.zshrc(我用的是 zsh) 中,然后在命令行中输入 cd 就好了.

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。