【问题标题】:Home directory navigation in bash scriptbash 脚本中的主目录导航
【发布时间】:2014-09-25 15:23:29
【问题描述】:

我需要一个简单的 .bashrc 文件的 bash 脚本函数来导航到我的主目录。 我们将 hg 用于目录中的所有工作目的,并包含许多流。

/home/<username>/RelStream1/
/home/<username>/RelStream2/
/home/<username>/RelStream3/
/home/<username>/RelStream4/

为了同名,我将此 /home//RelStream1/ 路径称为 repo home。

现在出于工作目的,我需要从我的 repo 主路径导航到子文件夹。 /home/&lt;username&gt;/RelStream1/pkgdir/appsdir/moduledir/submoduledir/.... 完成工作后,我需要回到 home repo 目录进行编译。 我已经添加了这样的别名,但记住返回的路径仍然很痛苦。

    alias ..="cd .."
    alias ..2="cd ../.."
    alias ..3="cd ../../.."
    alias ..4="cd ../../../.."
    alias ..5="cd ../../../../.."

请注意,任何时候都会使用许多 repo 主目录,因此将别名设置为 alias rhome='cd /home/&lt;username&gt;/RelStreamX/' 几乎没有用处。

我只需要一个简单的 bash 函数即可返回 repo 主目录(当前 repo)。 它必须获取当前路径并将我的目录导航回主 repo 目录

    Ex1:
    From: /home/<username>/RelStream1/pkgdir/appsdir/moduledir/submoduledir/
    To: /home/<username>/RelStream1/ 

    Ex2:
    From: /home/<username>/RelStream3/pkgdir/appsdir/moduledir/submoduledir/micromodule/
    To: /home/<username>/RelStream3/ 

    Ex3:
    From: /home/<username>/RelStream4/pkgdir/appsdir/
    To: /home/<username>/RelStream4/ 

我在bash(初学者)中尝试了一些方法,但没有给出预期的结果。

代码:

    repohome_func()
    {
    cwd=$(pwd)
    echo "CurrPath:${cwd}"
    sep="/"

    //My plan is to search the cur path with "/" char up to 4 times, 
    //cut the front string and then execute that cmd. 

    }alias rhome=repohome_func

【问题讨论】:

  • cd 将我带到主目录,但需要将其带到其他目录...请阅读我的问题
  • 你试过pushd pathToOtherFolder然后pop完成了吗?
  • 还没有,但需要尝试

标签: bash .bash-profile


【解决方案1】:

这应该适合你:

function repohome() {
    local repodir=${PWD/$HOME\/}
    cd "$HOME/${repodir%%/*}"
}

【讨论】:

  • 此解决方案无法正常工作。它回到 /home// 而不是 /home//RelStream1/
  • 你使用的是什么版本的 bash?
  • @userm:我刚刚在bash 3.2.484.3.11 上对其进行了测试,它工作正常。真的很奇怪,它不适合你。
【解决方案2】:

这应该是:

alias rhome="cd $(pwd | sed 's~/[^/]*~~4g')"

它使用pwd 获取当前路径并将其替换为需要的路径。因为这是在$() 内,所以我们在cd 那里。

您需要删除除前三个块之外的所有当前路径。有了这个sed,我们就做到了。

查看带有文件的示例:

$ cat a
/home/myuser/myrepo1/asld/as/asdf/asdf/asdf
/home/myuser/myrepo2/asdf
/home/myuser/myrepo3/asld/as/asdf/f/asdf
/home/myuser/myrepo4/asld/as/asdf/
$ sed 's~/[^/]*~~4g' a
/home/myuser/myrepo1
/home/myuser/myrepo2
/home/myuser/myrepo3
/home/myuser/myrepo4

从下面的评论来看,该解决方案似乎没有作为别名工作,而是作为一个函数工作。假设是cdpwdsed 中一定有一些别名,使它们的工作方式不同。

由于别名被函数绕过,这样使用它就可以了。否则,它也可以通过在任何命令之前使用\ 来工作,因此命令别名也会被绕过。

alias rhome="\cd $(\pwd | \sed 's~/[^/]*~~4g')"

更多信息:

【讨论】:

  • 我只想在 bash 提示符“rhome”中尝试一个 cmd,然后它应该让我进入当前的 repo 主目录。我不想被 X 打扰。
  • 为此,您只需要一个别名:alias rhome="cd /your/needed/path"。除此之外,X 是严格需要的,没有变量就无法指示变量行为。
  • 我将同时处理不同的 repo 目录。因此,该选项将适用于一个目录。
  • 此解决方案无法正常工作。它回到 /home// 而不是 /home//RelStream1/
  • @userm 好一个!那么别名中肯定有一些东西在困扰。您可以使用 \ (More info here on backslash): alias rhme="\cd $(\pwd | \sed 's~/[^/]*~~4g')" 绕过它们。此外,可以直接使用函数的名称。一旦你定义了这个函数,你就可以调用repohome_func
【解决方案3】:

如果你把你的主目录添加到CDPATH的前面,例如,

CDPATH=/home/<username>:.

那么与cd 一起使用的任何相对路径将首先在您的主目录中查找,然后是当前工作目录。那么

cd Relstream1

将在./Relstream1 之前将您带到/home/&lt;username&gt;/Relstream1

【讨论】:

  • 感谢您的 cmets,但我的意图是不打扰我正在工作的当前 repo 目录。它应该会自动导航回当前的 repo 目录。
【解决方案4】:

您可能想尝试内置命令pushdpopd。如果您使用pushd &lt;dir&gt; 而不是cd &lt;dir&gt;,则可以使用popd 返回上一个工作目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多