为了我自己的个人用途,我有几个常用的目录,并且希望能够在使用pushd 之间切换。我为我的.bashrc 提出了以下功能:
p() {
pushd +"$(($(dirs -p | sed -n '1d;s,.*/,,;/^'"$1"'/{=;q;}')-1))" >/dev/null
}
假设我有一个这样的目录堆栈:
$ dirs -v
0 ~/repos/local_only/configs
1 ~/repos/virtualization
2 ~/repos/local_only/work
3 ~/repos/core
4 ~/repos/local_only/my_test_repo
我可以只使用p <letter> 从当前目录切换到任何其他目录,其中<letter> 是目录名称的开头。 (当然,它可以不止一个字母。)例如,p m 将切换为my_test_repo; p w 将切换到 work。
如果我从work 目录中使用p c,它将切换到堆栈中以c 开头的下一个目录,在本例中为core。 (sed 命令的 q 部分阻止它返回比第一个结果更多的结果。)要专门切换到configs 目录,我可以使用p con,或者只使用p c,然后使用@987654340再次@。
sed 命令中的1d 使我永远不会切换到当前目录。因此,我可以只使用p c 在我的configs 目录和core 目录之间切换。
将stdout 重定向到/dev/null 可以防止在每次执行pushd 之后烦人的(对我而言)dirs。 (无论如何,我的提示中都列出了当前目录。)但是我不会让stderr 静音——所以如果我运行p q,例如,我会看到:
$ p q
-bash: pushd: +-1: directory stack index out of range
与内置函数互补
这不会取代pushd 和popd;它用于快速切换。要添加到目录堆栈,我仍然使用pushd <directory_name>。如果我在特定目录中完成(比如virtualization),我可以只使用p v 然后popd。
不太可能的错误:
这可能不适用于包含换行符的目录名称,但这对我的目的无关紧要。在任何情况下,它可能做的最糟糕的事情就是pushd你到了错误的目录。