2014年3月5日 星期三

Linux系統which與type指令,對比$PATH與Hashed路徑

我安裝Ruby後,為了搞定路徑花了老半天,後來弄懂了Linux指令在whichtype$PATHHashed就清楚多了。

如果你的系統有內建Ruby,打which ruby,會發現他的路徑在usr/bin/ruby底下,接著不管你用了什麼方法裝了新的Ruby,就把新的路徑在$PATH裡加到usr/bin的前面,系統通常就預設執行在$PATH裡面,放在前面先找到的那個Ruby。

但是有個情況,你加了$PATH以後沒有用,系統還是一直去執行舊的Ruby。可是打which ruby明明就是新的路徑呀?

我遇到的情況是這樣打type ruby會發現ruby is hased(/usr/bin/ruby),這是什麼意思呢?為什麼which rubytype ruby的路徑會不一樣。這種情況是ruby這個命令,在系統一開始就被寫在系統的hash table裡面。這邊簡單分類一下whichtype的不同:

  • which:
  • 單純從$PATH裡面尋找到的路徑。
  • type:
  • 指令真實被執行時使用的路徑。

which只是單純顯示在$PATH,type才是真實下命令按Enter後去執行的路徑。

所以安裝了新Ruby,可是系統若之前就把Ruby放在hash table裡面,他就會一直執行舊版本的Ruby,這時候只要重登目前這個Shell,讓hash table refresh一下就好了。如果還是不行,系統不曉得寫在什麼地方,他就是喜歡自動把舊Ruby放到hash table裡面。那就只好手動改了,在bash底下執行:

hash -r #清掉hash table裡所有的資料

上面這樣子是全清掉,全部的hash table重新建立。或者也可以像下面這樣:

hash -d ruby #單純在hash table清掉Ruby

這樣子hash table裡面沒有ruby了,系統就得乖乖執行$PATH裡面找到的ruby囉。

不只有ruby唷,不管安裝什麼php,python還是sqlite之類的,如果跟系統預設衝突,而且還是放在hash table裡面的,都可以用這個方法解決路徑的問題

沒有留言:

張貼留言