对于我自己的个人使用,我有几个我常用的目录,并希望能够在使用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
我可以使用 just 从当前目录切换到任何其他目录p <letter>,其中<letter>是目录名称的开头。(当然,它可以不止一个字母。)例如,p m将切换为my_test_repo; p w将切换到work.
如果我p c从我的work目录中使用,它将切换到堆栈中以 开头的下一个目录c,在本例中为core. (命令的q一部分sed阻止它返回比第一个结果更多的结果。)要专门切换到configs目录,我可以使用p con, 或者只是p c然后再p c一次。
1d命令中的是sed让我永远不会切换到当前目录。因此,我可以使用 just在我的configs目录和我的目录之间切换。corep c
to的重定向stdout可以/dev/null防止dirs每次执行pushd. (无论如何,我的提示中都列出了当前目录。)但是我不会沉默——所以stderr如果我运行p q,例如,我会看到:
$ p q
-bash: pushd: +-1: directory stack index out of range
与内建互补
这不会取代pushdand popd; 它用于快速切换。要添加到目录堆栈,我仍然使用pushd <directory_name>. 如果我在特定目录中完成(例如,virtualization),我可以p v然后popd.
不太可能的错误:
这可能不适用于包含换行符的目录名称,但这对我的目的无关紧要。无论如何,它可能做的最糟糕的事情就是pushd您进入错误的目录。