对于我自己的个人使用,我有几个我常用的目录,并希望能够在使用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
目录和我的目录之间切换。core
p c
to的重定向stdout
可以/dev/null
防止dirs
每次执行pushd
. (无论如何,我的提示中都列出了当前目录。)但是我不会沉默——所以stderr
如果我运行p q
,例如,我会看到:
$ p q
-bash: pushd: +-1: directory stack index out of range
与内建互补
这不会取代pushd
and popd
; 它用于快速切换。要添加到目录堆栈,我仍然使用pushd <directory_name>
. 如果我在特定目录中完成(例如,virtualization
),我可以p v
然后popd
.
不太可能的错误:
这可能不适用于包含换行符的目录名称,但这对我的目的无关紧要。无论如何,它可能做的最糟糕的事情就是pushd
您进入错误的目录。