将目录传递给 cd

Sni*_*192 0 cd-command fzf

我有一个函数,我希望它能让我对我一直在查看的最新目录进行模糊搜索并节省时间,这是一个简单的 1 行:

dirs | sed 'y/ /\n/' | fzf | xargs cd
Run Code Online (Sandbox Code Playgroud)

2 小时后,我不知道出了什么问题):

我不断收到以下错误:

/usr/bin/cd: line 4: cd: ~/Downloads/demo: No such file or directory
Run Code Online (Sandbox Code Playgroud)

即使目录确实存在,无论我做什么。cd 怎么了,为什么这不起作用?

感谢您的评论:更多信息 我尝试了其他一些方法,例如编写函数:

fdr() {
     local dir
     dir=`dirs | sed 'y/ /\n/' | fzf`
     cd $dir
}  
Run Code Online (Sandbox Code Playgroud)

虽然 dir具有正确的值,我得到与上面相同的错误。

我的最终功能

感谢您的帮助,sub shells 正在让我思考,这是我的最终答案,有点hackey,但现在不是什么。

/usr/bin/cd: line 4: cd: ~/Downloads/demo: No such file or directory
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

这里有三个问题:

  1. 该目录路径是考虑到cd为文本字符串~/Downloads/demo,即使正确的路径可能是类似/Users/snickers/Download/demo。

    通常,当您cd ~/Downloads/demo在命令行上键入时,shell 会在运行cd命令之前将波浪号扩展到您的主目录的路径。此处不会发生这种情况,因为波浪号扩展发生在变量扩展之前(请参阅“如何理解扩展之间的顺序? ”)。

    假设您正在使用bashshell, usingdirs -l可以通过让dirs输出完整路径来绕过此问题。

  2. cd是一个 shell 内置命令。在您的 macOS 机器上,它也可以作为外部命令使用/usr/bin/cd,这就是为什么您不会像许多其他 Unix 用户在使用cdwith时那样收到“找不到命令”错误的原因xargs。但是,外部cd命令永远不能更改当前 shell 的目录。这在“为什么 cd 不是程序? ”和“ `cd` 位于何处? ”以及类似问题中进行了描述。您的 shell 函数变体绕过了这个问题,因为它使用了您的 shell 的内置cd命令。

  3. 最后一个问题,它是第二个问题的一个变体,并且由于其他问题实际上并没有发挥作用,是该cd命令在由 执行时xargs不仅是无法更改工作目录的外部命令对于调用 shell,但是调用它的命令是xargs,它又在子 shell 中作为管道的一个阶段运行。在子 shell 中更改 shell 不会在父 shell 中更改它。

你应该可以使用

fdr () {
   cd "$( dirs -l -p | fzf )"
}
Run Code Online (Sandbox Code Playgroud)

其中每行dirs -l -p从目录堆栈中输出一个目录bash,并展开波浪号。这假设您在堆栈上没有名称中嵌入换行符的目录,但将支持带空格的目录(您自己的函数不这样做,部分原因是sed转换,部分原因是没有引用 的扩展$dir)。