与pushd
和popd
相比,是否有更直观的方式来处理目录堆栈?
我发现向用户呈现pushd
和popd
内置命令的CLI令人难以置信。但与此同时,我希望经常使用dirs
内置命令提供的目录堆栈。
因此我花了很长时间才弄清楚用例然后记住以下内容:
pushd
- 从顶部切换两个目录。pushd +1
- 从顶级目录更改为第二个。pushd -0
- 从顶层目录更改为底部。popd +0
- 将顶部更改为顶层目录中的第二个。pushd -0; popd +1
- 从顶层目录更改为底部并弹出前顶部。每次只是为了玩弄目录堆栈而仍然需要输入它们对我来说很重要。我甚至不能用助记名来为这五个用例添加别名。
任何见解?
答案 0 :(得分:6)
最近我发现了GNU readline库的强大功能以及它可以在Bash命令行上为用户提供的关键笔划的快捷方式。
因此,我在~/.inputrc
文件中定义了以下热键。 GNU readline的配置文件:
# "pushd" use case.
"\C-^": "\C-a\C-kpushd\C-m"
# "pushd +1" use case.
"\e<": "\C-a\C-kpushd +1\C-m"
# "popd +0" use case.
"\ex\e<": "\C-a\C-kpopd +0\C-m"
# "pushd -0" use case.
"\e>": "\C-a\C-kpushd -0\C-m"
# "pushd -0; popd +1" use case.
"\ex\e>": "\C-a\C-kpushd -0; popd +1\C-m"
我将上面的热键关联如下:
<ctrl>-^
- vim
热键可以切换当前缓冲区的当前值。<alt>-<
- 向左移动并随身携带。<alt>-x<
- 向左移动并裁剪。<alt>->
- 向右移动并随身携带。<alt>-x>
- 向右移动并裁剪。 <ctrl>-ak
键击将光标定位在行的开头(a)并删除(k)它。这很重要,因为当<ctrl-m>
(输入)被击中时,用户可能会在句子中间点击热键。使用当前用户输入时,热键值会出现乱码,而bash无法执行它。
答案 1 :(得分:0)
对于我个人使用,我有几个通常使用的目录,并且希望能够在使用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
。
如果我使用p c
目录中的work
,它将切换到堆栈中的下一个目录,该目录以c
开头,在这种情况下为core
。 (q
命令的sed
部分阻止它返回的结果超过第一个结果。)要专门切换到configs
目录,我可以使用p con
,或者只需p c
然后再p c
。
1d
命令中的sed
使我无法切换到当前目录。因此,我可以仅使用configs
在我的core
目录和p c
目录之间切换。
stdout
重定向到/dev/null
可以防止每次执行dirs
后对pushd
执行烦人的事情。 (无论如何,我的提示中列出了当前目录。)但是我不会沉默stderr
- 所以如果我运行p q
,我会看到:
$ p q
-bash: pushd: +-1: directory stack index out of range
内置补充
这不会取代pushd
和popd
;它旨在快速切换。要添加到目录堆栈,我仍然使用pushd <directory_name>
。如果我在特定目录(例如virtualization
)中完成,我可以p v
然后popd
。
不太可能出错:
这可能无法正常使用包含换行符的目录名称,但这对我的目的并不重要。在任何情况下,最糟糕的是pushd
你到了错误的目录。
答案 2 :(得分:0)
这是我的工作流程:
<强> 0。 CONF(假数据)
cd /tmp
mkdir -p foo/bar baz qux
<强> 1。 CONF 强>
dirs -v
cd foo/bar; pushd .; cd ../..
cd baz; pushd .; cd ..
cd qux; pushd .; cd ..
<强> 2。 RUN 强>
dirs -v
cd $(dirs +1) # switch to dir 1
cd $(dirs +2) # switch to dir 2
cd $(dirs +3) # switch to dir 3
可以通过快速记录这一点来更好地解释:https://asciinema.org/a/148441
<强> PRO 强>