2016-11-25 5 views
-1

私はMacOS上ですが、* nixでも動作するクロスプラットフォームのソリューションを探しています。簡単な質問ですが、どのようにスクリプトをbashでこのパスを解決できますか?bashでパスを解決する

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

このパスは、私が手に持っている2枚で構成されています解像度を表し、絶対パスを取得するための最良の方法は何か

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

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

その2つのパスのうちのどれですか?

私のMacにはreadlinkがありますが、* nixマシンと同じユーティリティではありません。もっとも重要なのは、私のreadlinkユーティリティには、* nixユーティリティが実行する可能性のある-fオプションがないため、それを使用できないようです。

+0

を参照してください:[スクリプト内からbashスクリプトの現状/現在の作業ディレクトリを取得](http://stackoverflow.com/q/59895/3776858) – Cyrus

+0

ちょうどそこからいくつかのことを試してみました - ことができますあなたはあなたの答えが私を助けるだろうと思っていますか? –

+1

最初の答えがあなたのスクリプトであなたを助けることができると思います: 'DIR =" $(cd "$(dirname" $ {BASH_SOURCE [0]} ")" && pwd) "'私はMacOSとbashでそれらをテストする方法がない。 – Cyrus

答えて

1

bashは、このようなタスクを完全に処理することができます。最後にファイル名を指定せずに、私たちが得たディレクトリへ

  • cdの変更、およびpwdディスプレイパスを返しdirname

    MYPATH=/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin/../lib/node_modules/suman/cli/cli.sh 
    RESOLVED="$(cd $(dirname $MYPATH) && pwd)/$(basename $MYPATH)" 
    
    • :メインの質問のコメントからインスピレーションを取ると、あなたはこのような何かを行うことができますカレントディレクトリ。
    • basenameは、dirnameの反対であり、ファイルの名前を返します。
    • それらの命令の全てをサブシェルで実行されたとして、我々は我々のメインスクリプト

    EDITで実際に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

    瞬間のために、私は率直に言って、bashがないクールですべてです、それを

    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'))"); 
    

    をこの方法で解決しました。私がこのような無差別な言動に頼らなければならないという事実は、無縁です。

    +2

    問題が複雑になっています。 'bash'はそのようなタスクを完全に処理できます。 @Cyrusが主な質問のコメントで指摘したように、あなたは以下を行うことができます: 'MYPATH =/some/stuff /../ otherstuff/a.sh; RESOLVED = "$(cd $(dirname $ MYPATH)&& pwd)/ $(basename $ MYPATH)" – Aserre

    +0

    解決策を試してみましょう。 –

    +0

    あなたのアイデアはうまくいくように思えますが、なぜそれが役に立つのか分かりません。 –

    関連する問題