我有一个函数,我希望它能让我对我一直在查看的最新目录进行模糊搜索并节省我的时间,一个简单的 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"
}
答案1
这里存在三个问题:
cd
目录路径名作为文字字符串给出,~/Downloads/demo
即使正确的路径可能类似于/Users/snickers/Download/demo
.通常,当您
cd ~/Downloads/demo
在命令行上键入时,shell 会将波形符扩展为您的主目录的路径,然后再运行命令cd
。这在这里不会发生,因为波形符扩展发生在变量扩展之前(参见“如何理解扩展之间的顺序?”)。假设您使用的是
bash
shell,则 using可以通过输出完整路径dirs -l
来绕过此问题。dirs
cd
是 shell 内置命令。在你的 macOS 机器上,它也可以作为外部命令使用/usr/bin/cd
,这就是为什么你不会像许多其他 Unix 用户在cd
使用xargs
.但是,外部cd
命令永远无法更改当前 shell 的目录。这在“为什么 cd 不是一个程序?“ 和 ”`cd` 位于哪里?”以及类似的问题。您的 shell 函数变体绕过了此问题,因为它使用 shell 的内置cd
命令。最后一个问题是第二个问题的变体,并且由于其他问题而实际上没有发挥作用,即该
cd
命令在由 执行时xargs
不仅是无法更改工作目录的外部命令对于调用 shell,但调用它的命令是xargs
,而该命令又作为管道的一个阶段在子 shell 中运行。在子 shell 中更改 shell 不会在父 shell 中更改它。
你应该能够使用
fdr () {
cd "$( dirs -l -p | fzf )"
}
其中每行dirs -l -p
输出目录堆栈中的一个目录,并扩展波浪号。bash
这假设您的堆栈上没有名称中嵌入换行符的目录,但是将要支持带有空格的目录(您自己的函数不这样做,部分是因为转换sed
,部分是因为没有引用 的扩展$dir
)。