【问题标题】:How to leverage the clumsy pushd and popd with the awsome dirs built-in command of Bash如何利用 Bash 的真棒 dies 内置命令来利用笨拙的 pushd 和 popd
【发布时间】:2012-11-04 06:46:39
【问题描述】:

难道没有比pushdpopd 更直观的处理目录堆栈的方法吗?

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

所以我花了很长时间才弄清楚用例,然后记住以下几个:

  1. pushd - 从顶部切换两个目录。
  2. pushd +1 - 从顶层目录切换到第二个。
  3. pushd -0 - 从顶层目录切换到底层。
  4. popd +0 - 弹出顶部更改为顶部目录中的第二个。
  5. pushd -0; popd +1 - 从顶部目录切换到底部并弹出前顶部。

我仍然不得不每次都输入它们来处理目录堆栈,这对我来说感觉太重了。我什至无法想出助记名称来给这五个用例起别名。

有什么见解吗?

【问题讨论】:

    标签: bash stack directory-structure built-in


    【解决方案1】:

    最近我发现了 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. &lt;ctrl&gt;-^ - vim 热键切换当前缓冲区和上一个缓冲区。
    2. &lt;alt&gt;-&lt; - 左移并进位。
    3. &lt;alt&gt;-x&lt; - 向左移动并裁剪。
    4. &lt;alt&gt;-&gt; - 右移并进位。
    5. &lt;alt&gt;-x&gt; - 右移并裁剪。

    &lt;ctrl&gt;-ak 击键将光标定位在行首 (a) 并删除 (k)。这很重要,因为当&lt;ctrl-m&gt;(回车)被点击时,用户很有可能在句子中间点击了热键。热键值会因当前用户输入而出现乱码,bash 无法执行。

    【讨论】:

      【解决方案2】:

      为了我自己的个人用途,我有几个常用的目录,并且希望能够在使用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 &lt;letter&gt; 从当前目录切换到任何其他目录,其中&lt;letter&gt; 是目录名称的开头。 (当然,它可以不止一个字母。)例如,p m 将切换为my_test_repop 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
      

      与内置函数互补

      这不会取代pushdpopd;它用于快速切换。要添加到目录堆栈,我仍然使用pushd &lt;directory_name&gt;。如果我在特定目录中完成(比如virtualization),我可以只使用p v 然后popd


      不太可能的错误:

      这可能不适用于包含换行符的目录名称,但这对我的目的无关紧要。在任何情况下,它可能做的最糟糕的事情就是pushd你到了错误的目录。

      【讨论】:

        【解决方案3】:

        这是我的工作流程:

        0。 CONF(假数据)

        cd /tmp
        mkdir -p foo/bar baz qux
        

        1.确认

        dirs -v
        cd foo/bar; pushd .; cd ../..
        cd baz; pushd .; cd ..
        cd qux; pushd .; cd ..
        

        2。运行

        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

        专业版

        • 在 conf:原始和快捷方式的最小集
        • 运行时:同上。只使用索引。大部分是只读的,它们甚至永远不会改变。

        【讨论】:

          猜你喜欢
          • 2014-10-06
          • 1970-01-01
          • 1970-01-01
          • 2019-07-03
          • 2019-11-12
          • 2016-12-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多