如何利用笨拙的pushd和popd以及Bash的内置命令

时间:2012-11-15 16:02:01

标签: bash stack directory-structure built-in

pushdpopd相比,是否有更直观的方式来处理目录堆栈?

我发现向用户呈现pushdpopd内置命令的CLI令人难以置信。但与此同时,我希望经常使用dirs内置命令提供的目录堆栈。

因此我花了很长时间才弄清楚用例然后记住以下内容:

  1. pushd - 从顶部切换两个目录。
  2. pushd +1 - 从顶级目录更改为第二个。
  3. pushd -0 - 从顶层目录更改为底部。
  4. popd +0 - 将顶部更改为顶层目录中的第二个。
  5. pushd -0; popd +1 - 从顶层目录更改为底部并弹出前顶部。
  6. 每次只是为了玩弄目录堆栈而仍然需要输入它们对我来说很重要。我甚至不能用助记名来为这五个用例添加别名。

    任何见解?

3 个答案:

答案 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"

我将上面的热键关联如下:

  1. <ctrl>-^ - vim热键可以切换当前缓冲区的当前值。
  2. <alt>-< - 向左移动并随身携带。
  3. <alt>-x< - 向左移动并裁剪。
  4. <alt>-> - 向右移动并随身携带。
  5. <alt>-x> - 向右移动并裁剪。
  6. <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

内置补充

这不会取代pushdpopd;它旨在快速切换。要添加到目录堆栈,我仍然使用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

  • at conf:最小的原始和快捷方式
  • at run:idem。只使用索引。他们甚至永远不会改变。