Bashでシンボリックリンクを解決せずに相対パスを解決します。

Bashでシンボリックリンクを解決せずに相対パスを解決します。

シンボリックリンクを解決せずに相対パスを絶対パスとして解決する移植可能な方法を探しています。

たとえば、/home/nat/cat/bat/hat.shBash で次のファイルを実行します。

set -x
pwd
# cat is a symlink
readlink -e ..
# abs is an imaginary function that returns the path in the form specified by this question    
abs ..
abs /home/./nat/../nat/cat

出力:

+ pwd
/home/nat/cat/bat
+ readlink -e ..
/home/nat/cat-1.12.0
+ abs ..
/home/nat/cat
+ abs /home/./nat/../nat/cat
/home/nat/cat

realpath -s残念ながら、OSXではデフォルトでは使用できないため使用できません。

答え1

仮想関数の具体化は次のとおりです。

abs () {
  local _PWD _BN
  [ -d "${1}" ] && _PWD="${1}"
  [ -f "${1}" ] && { _PWD=$(dirname "${1}") ;  _BN=/$(basename "${1}") ;}
  pushd $_PWD >/dev/null
  echo $(pwd)${_BN}
  popd >/dev/null
}

ファイルまたはディレクトリパスを引数として渡すことができます。次に、指定されたパスに移動して目的の作業ディレクトリを印刷します。特定の要件によっては、空のパラメータ、存在しないパス、または権限不足などのいくつかの検証を追加する必要があります。この例ではこれを省略しました。

二人がpushd/popd目標物に向かってジャンプして帰ってくる動作を遂行する。

>/dev/nullこれらのコマンドがデフォルトで実行されているディレクトリスタックを印刷するのを防ぎます。これにより、目的の出力が中断される可能性があります。

関連情報