2014-09-25 112 views
0

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

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

对于同名我称此/家// RelStream1 /路径作为回购家。

现在为了工作目的,我需要从我的回购主路径导航到子文件夹。 /home/<username>/RelStream1/pkgdir/appsdir/moduledir/submoduledir/.... 完成工作后,我需要回到首页repo目录进行编译。 我已经添加了这样的别名,但仍然很难记住回来的路径。

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

请注意,许多回购主目录将在任何时间点被使用,因此设定的别名alias rhome='cd /home/<username>/RelStreamX/'将几乎毫无用处。

我只需要一个简单的bash函数来回到回购主目录(当前回购)。 它来得到当前的路径和浏览我的目录回到家里回购目录

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 
+0

cd把我带到主目录,但它需要带到其他目录......请阅读我的问题 – 2014-09-25 15:26:45

+0

您是否尝试过'pushd pathToOtherFolder',然后在完成时弹出? – MrTux 2014-09-25 15:27:52

+0

还没有,但需要尝试 – 2014-09-25 15:31:15

回答

0

这应该使:

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 

从什么是下面的评论,好像该解决方案是不工作的别名,但它作为一个功能。假设是在cd,pwdsed中必须有一些别名,这使得它们的工作方式不同。

由于别名被函数绕过,使用它来实现它。否则,它也可以在任何命令之前使用\工作,所以命令别名也被绕过。

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

更多信息:

+0

我只是想在bash提示符“rhome”中尝试一个cmd,那么它应该让我到当前的repo主目录。我不想被X困扰。 – 2014-09-25 15:33:28

+0

为此,你只需要一个别名:'alias rhome =“cd/your/needed/path”'。除此之外,'X'是严格需要的,没有变量就没有办法表示变量的行为。 – fedorqui 2014-09-25 15:34:04

+0

我将同时处理不同的回购目录。因此该选项将适用于一个目录。 – 2014-09-25 15:35:01

1

这应该为你工作:

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

此解决方案无法正常工作。它回到/ home/ /而不是/ home//RelStream1/ – 2014-09-26 05:58:56

+0

您使用的是什么版本的bash? – pgl 2014-09-26 10:43:19

+0

@userm:我刚刚在'bash 3.2.48'和'4.3.11'上测试过,它工作正常。真的很奇怪,它不适合你。 – pgl 2014-09-26 10:54:46

0

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

CDPATH=/home/<username>:. 

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

cd Relstream1 

将带你到/home/<username>/Relstream1./Relstream1之前。

+0

感谢您的意见,但我的意图是不打扰当前回购目录,我在哪里工作。它应该自动回到当前的repo目录。 – 2014-09-26 06:03:21

0

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