2014-09-25 139 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返回到上一個工作目錄。