39

Linux 2.6 で bash を使用して環境変数を設定するスクリプトを作成しています。したがって、スクリプトには次のようなコマンドが含まれています。

export SRC_DIR=..
export LIBPATH=${SRC_DIR}/lib

問題は、echo $LIBPATH を実行しようとすると、SRC_DIR をフル パスに展開するのではなく、「../lib」と表示されることです。../lib ではなく、/home/x/lib のようなものをスクリプトに出力させたいと思っています。

更新スクリプトは、スクリプトが呼び出された現在のディレクトリではなく、スクリプトの場所から1つ上のディレクトリであるとSRC_DIRを評価する必要があります

4

7 に答える 7

63

サブシェルでディレクトリを変更

現在の作業ディレクトリを変更せずに、相対パスから絶対パスを取得するために使用できるちょっとしたトリックがあります。トリックは、サブシェルで相対パスに移動してから、作業ディレクトリを展開することです。例えば:

export SRC_DIR=$(cd ..; pwd)

呼び出しディレクトリの代わりにスクリプトからの相対パス

現在の作業ディレクトリではなく、スクリプトの場所からの相対パスに変更するには、パラメーター展開またはdirnameユーティリティを使用できます。もう少し明示的であるため、私はdirnameを好みます。両方の例を次に示します。

# Using /usr/bin/dirname.
export SRC_DIR=$(cd "$(dirname "$0")/.."; pwd)

# Using the "remove matching suffix pattern" parameter expansion.
export SRC_DIR=$(cd "${0%/*}/.."; pwd)
于 2012-07-23T23:01:34.263 に答える
16

このreadlinkコマンドは、シンボリック リンクを解決するだけでなく、相対パスを正規化することもできます。すべてのスクリプトでシンボリックリンクを解決する動作が必要ない場合があるため、注意してください。シンボリックリンクを解決したくない場合は、pwdこれが最適です。サブシェルの使用に注意してください。したがって、cd コマンドはメイン シェルの作業ディレクトリには影響しません。

# The path you want to get information on... (for readability)
your_path=..

# Using /bin/readlink (resolves symlinks)
export SRC_DIR=$(readlink --canonicalize $your_path)

# Using /usr/bin/dirname (keeps symlinks)
export SRC_DIR=$(cd $your_path ; pwd)
于 2014-02-10T21:10:07.597 に答える
9

私は通常使用します

SCRIPT_DIR=$(readlink -f ${0%/*})

スクリプトへの完全なパスを返し、途中ですべてのリンクを解決する必要があります。

于 2012-07-23T23:17:00.953 に答える
1

私がこれを行うとき、私は次のようにエコーを使用します:

export SRC_DIR=`echo $HOME/bin/`
于 2012-08-09T06:49:39.043 に答える
0

代わりにこれを行います:

export SRC_DIR=`pwd`;

アップデート:

ファイルシステム上のスクリプトの場所に相対的なパスが必要なため、代わりにこれを使用します。

export SRC_DIR=`dirname $0`

更新 2:

スクリプトは、bash /path/to/script.shまたはとしてではなく、直接呼び出す必要がありますsource foo.shシバン行を追加し、実行権限を追加して、スクリプトを直接呼び出します。

于 2012-07-23T22:51:49.200 に答える
0

エラーコードを保持する場合:

function getPwd() {
    $(cd $1; [[ $? -ne 0 ]] && exit 1 || echo echo $PWD;)
    return $?
}
于 2018-07-17T14:00:47.797 に答える