2016-11-25 121 views
-1

我在MacOS上,但正在尋找一種跨平臺的解決方案,它也可用於* nix。簡單的問題,我該如何用bash腳本解決這個問題?使用bash解析路徑

/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin/../lib/node_modules/suman/cli/cli.sh 

這條道路是由兩片我手上:

/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin 

../lib/node_modules/suman/cli/cli.sh 

是什麼讓表示分辨率的絕對路徑的最佳方式那兩條路?

請注意,我的Mac上有readlink,但它看起來與* nix機器上的相同。最重要的是,我的readlink實用程序沒有-f選項,* nix實用程序可能會這樣做,所以我似乎無法使用該選項。

+0

參見:從腳本中獲取一個bash腳本的電流/當前工作目錄(http://stackoverflow.com/q/59895/3776858) – Cyrus

+0

只是試圖從那裏一些東西 - 可以你詳細說明你認爲會對我有何幫助的答案? –

+1

我想第一個答案可以幫助你在你的腳本中:'DIR =「$(cd」$(dirname「$ {BASH_SOURCE [0]}」)「&& pwd)」'。我沒有辦法用MacOS和bash來測試它們。 – Cyrus

回答

1

bash完全能夠處理這樣的任務。與主要問題的意見取得靈感,你可以做這樣的事情:

MYPATH=/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin/../lib/node_modules/suman/cli/cli.sh 
RESOLVED="$(cd $(dirname $MYPATH) && pwd)/$(basename $MYPATH)" 
  • dirname沒有文件名在年底返回的路徑
  • cd改變我們得到了目錄,pwd顯示當前目錄。
  • basenamedirname相反,並返回文件的名稱。
  • 所有的這些指令是在子shell執行,我們在主腳本

編輯居然沒有cd:我放棄使用工具,我熟悉了這個答案。但是,我剛剛查看了您在問題中提到的readlink實用程序。對於我來說-m選項似乎工作得很好。這個標誌在mac上可用嗎?

readlink -m /home/myusername/Documents/test_dir/dir_1/../dir_2/test.sh 
> /home/myusername/Documents/test_dir/dir_2/test.sh 
+0

Idk取決於程序解釋路徑,並非所有程序都能正確解釋它 –

+0

readlink -m在mac上不可用TMK –

-1

目前,我解決了它這種方式

DIRN="/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin" 

EXECDIR="../lib/node_modules/suman/cli/cli.sh" 

RESOLVED=$(node -e "var path = require('path'); process.stdout.write(path.resolve('$DIRN/$EXECDIR'))"); 

坦率地說,是bash 涼的。我不得不求助於這些惡棍的事實是無稽之談。

+2

您正在過度複雜化該問題。 'bash'完全能夠處理這樣的任務。正如@Cyrus在主要問題評論中指出的那樣,你可以執行以下操作:'MYPATH =/some/stuff /../ otherstuff/a.sh; RESOLVED =「$(cd $(dirname $ MYPATH)&& pwd)/ $(basename $ MYPATH)」' – Aserre

+0

讓我試試你的解決方案。 –

+0

好吧,你的想法似乎工作,我明白了它爲什麼,隨意添加它作爲答案 –