web-dev-qa-db-ja.com

bash:PWDとCURDIRの違いは何ですか?

私の問題

Makefileを使用して_docker run_ターゲットを実行します。これには、パラメーターの1つとして現在の作業ディレクトリが必要です。

$(PWD)または$(CURDIR)を使用します:

_build: Dockerfile
        docker run ... <$(PWD) or $(CURDIR)>
_

彼らは同じ価値を生み出しているようです。後で噛み付くような微妙な違いがあるかどうかはわかりません。そのため、それぞれの正確な定義を知りたいのです。

私は何を試しましたか

  • STFW
  • _man make_

私の質問

Makefileの$(PWD)$(CURDIR)の違いは何ですか?

6
Adam Matan

TL; DR

CURDIRを使用します。

どうして?

まず、 彼のコメント に対して Renaud Pacalet に感謝します。

CURDIR

引用 GNU Make Manual

[〜#〜] curdir [〜#〜]

現在の作業ディレクトリの絶対パス名に設定します。

便宜上、GNU makeが起動すると(-Cオプションを処理した後)、変数CURDIRが現在の作業ディレクトリのパス名に設定されます。この値は、makeによって再び変更されることはありません。特に、他のディレクトリのファイルを含める場合、CURDIRの値は変更されないことに注意してください。この値は、makefileで設定された場合と同じ優先順位を持ちます(デフォルトでは、環境変数CURDIRはこの値をオーバーライドしません)。この変数を設定しても、makeの操作には影響しません(たとえば、makeが作業ディレクトリを変更することはありません)。

PWD

MakeマニュアルにはPWDへの言及はありません。クイック env | grep PWDは、環境(私の場合はzsh)によって設定されていることがわかりました。 特別なシェル変数 に関するGNUの注記は、次のように述べています。

PWD

Posix 1003.1-2001では、cdおよびpwdが現在のディレクトリの論理名を指すようにPWD環境変数を更新する必要がありますが、従来のシェルはこれをサポートしていません。これは、1つのシェルインスタンスがPWDを維持しているが、補助的で別のシェルがPWDを認識せず、cdを実行する場合に混乱を引き起こす可能性があります。この場合、PWDは間違ったディレクトリを指します。 「pwd' rather than $ PWD '。

CURDIRMakeで動作することが保証されているため、PWDmightはシェルから継承されるため、前者が優先されます。

10
Adam Matan