我有一个功能,我希望它能让我对我一直在查看的最新目录进行模糊搜索并节省我的时间,一个简单的 1 班轮:
dirs | sed 'y/ /\n/' | fzf | xargs cd
2小时后,我无法弄清楚出了什么问题):
我不断收到以下错误:
/usr/bin/cd: line 4: cd: ~/Downloads/demo: No such file or directory
即使目录确实存在,无论我做什么。cd怎么了,为什么这不起作用?
感谢您的评论:更多信息 我尝试了其他一些方法,例如编写函数:
fdr() {
local dir
dir=`dirs | sed 'y/ /\n/' | fzf`
cd $dir
}
即使dir
具有正确的值,我也会得到与上面相同的错误。
我的最终功能
感谢您的帮助,子壳正在使我头疼,这是我的最终答案,有点骇人听闻,但是这些天不是。
fdr() {
local dir
myusernmae=`whoami`
dir=`dirs | sed 'y/ /\n/' | sed "s/~/\/Users\/$myusernmae/g" | fzf +m`
cd "$dir"
}
这里有三个问题:
即使正确的路径可能
cd
类似于.~/Downloads/demo
/Users/snickers/Download/demo
通常,当您在命令行上键入时,shell 会在运行命令
cd ~/Downloads/demo
之前将波浪号展开到您的主目录的路径。cd
这在这里不会发生,因为波浪号扩展发生在变量扩展之前(请参阅“如何理解扩展之间的顺序? ”)。假设您使用的是
bash
shell,usingdirs -l
可以通过让dirs
输出完整路径来绕过这个问题。cd
是一个shell内置命令。在您的 macOS 机器上,它也可以作为外部命令使用/usr/bin/cd
,这就是为什么您没有像许多其他 Unix 用户在使用cd
with时遇到“command not found”错误的原因xargs
。但是,外部cd
命令永远不能更改当前 shell 的目录。这在“为什么 cd 不是程序? ”和“ `cd` 位于哪里? ”和类似问题中有所描述。你的 shell 函数变体绕过了这个问题,因为它使用你的 shell 的内置cd
命令。最后一个问题是第二个问题的变体,由于其他问题而实际上并没有发挥作用,是该
cd
命令在执行时xargs
不仅是无法更改工作目录的外部命令对于调用 shell,但调用它的命令是xargs
,它又在子 shell 中作为管道的一个阶段运行。在子 shell 中更改 shell 不会在父 shell 中更改它。你应该可以使用
其中每行
dirs -l -p
从目录堆栈输出一个目录bash
,波浪号展开。这假设您在堆栈上没有目录名称中嵌入了换行符,但将支持带有空格的目录(您自己的函数不这样做,部分原因是sed
转换,部分原因是没有引用 的扩展$dir
)。