その変数をスクリプトで使用したいが$PWD
シンボリックリンクを持たないハードウェアパスになりたいです。私は知って/bin/pwd
いますがpwd -P
、それは変数ではありません。
以下が利用可能であることを知っています。
setenv MYPWD `pwd -P`
しかし、他の方法があることを覚えています。
答え1
POSIXシェルでは、
cd -P .
$PWD
シンボル化されていないリンクを含むパス。
inはシンボリックリンクされていないバージョンに展開されますzsh
(変数だけでなくすべての変数に適用されます)。$PWD:A
$PWD
$PWD
zsh
、setopt chase_links
およびでシンボリックリンクtcsh
がないことを確認するset symlinks = chase
必要があります。ただし、これは最初の後にのみ機能します。ではシンボリックリンクを無料で作成しますが、必要な場所ではそうではありません(動作は保証されていません)。cd
$PWD
cd
zsh
cd .
$PWD
tcsh
cd "$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%??}
}