$ PWD変数はpwd -Pと同じです。

$ PWD変数はpwd -Pと同じです。

その変数をスクリプトで使用したいが$PWDシンボリックリンクを持たないハードウェアパスになりたいです。私は知って/bin/pwdいますがpwd -P、それは変数ではありません。

以下が利用可能であることを知っています。

setenv MYPWD `pwd -P`

しかし、他の方法があることを覚えています。

答え1

POSIXシェルでは、

cd -P .

$PWDシンボル化されていないリンクを含むパス。

inはシンボリックリンクされていないバージョンに展開されますzsh(変数だけでなくすべての変数に適用されます)。$PWD:A$PWD$PWD

zshsetopt chase_linksおよびでシンボリックリンクtcshがないことを確認するset symlinks = chase必要があります。ただし、これは最初の後にのみ機能します。ではシンボリックリンクを無料で作成しますが、必要な場所ではそうではありません(動作は保証されていません)。cd$PWDcdzshcd .$PWDtcshcd "$cwd"

答え2

私が知る限り、環境はその値がリンクされたバージョンではなく実際のパスであることを保証するためにそのような変数を提供しません。

したがって、選択肢はすでに述べた項目と以下の選択肢に限定されます。

リンクを読む

以下を使用して、readlinkシンボリックリンクが指す実際のディレクトリ/ファイルをインポートできます。

はい

サンプル:

$ ln -s /usr/bin/ack ack

$ ls -l |grep ack
lrwxrwxrwx   1 saml saml        12 Aug 15 11:48 ack -> /usr/bin/ack

物理的な位置:

$ readlink ./ack
/usr/bin/ack
$ readlink /home/saml/ack 
/usr/bin/ack
$ readlink $HOME/ack
/usr/bin/ack

渡された値がreadlinkリンクでない場合は何も返しません。スイッチを使用して標準値を返すように強制できます-f

$ echo $PWD
/home/saml

$ readlink -f $PWD
/home/saml

引用する

答え3

を使用すると、ksh93その変数を実装する簡単な方法があります。スクリプトの先頭にこの規律関数を追加するか、スクリプトにインポートします。

function PWDP.get
{
  .sh.value=$(pwd -P)
}

その後、期待どおりにPWDP変数を使用できます。

$ mkdir /tmp/foo
$ ln -s /tmp/foo /tmp/bar
$ cd /tmp/bar
$ echo $PWD
/tmp/bar
$ echo $PWDP
/tmp/foo

編集する、「少し」より複雑なソリューションは、Stéphane Chazelasのポイントをカバーしようとします。

function PWDP.get
{
    typeset p=$(pwd -P; echo .)
    .sh.value=${p%??}
}

関連情報