2012-05-29 16 views
8

現在の作業ディレクトリのパスを解析するシェルスクリプトを作成しています(現在のディレクトリの上にあるすべてのベース名のようなものを出力します)。

これまでのところ、私はパスを解析するために、環境変数PWDを使用してきたが、

  • は、私はいつも
  • は、すべてのプラットフォーム上で同じ結果を与えるように設定することPWDに数えることができるのだろうか

シェル内蔵のpwdを使用する方がよいでしょうか?できるだけ多くのプラットフォームで実行するためにこのスクリプトが必要なので、私はちょうど不思議でした...

答えて

13

POSIXは以下の方法で設定する$PWDが必要です。

PWD 

この変数は、現在の作業ディレクトリの絶対パス名を表現しなければなりません。それはドットまたはドットドットであるコンポーネントを含んではならない。この値は、cdユーティリティーおよび初期化時のshユーティリティーによって設定されます。

だから、その–設定されているに頼ることができますが、「...絶対パス...」、ではない絶対パスをメモします。

bash(少なくとも最近のバージョン)は、$PWD(と組み込みのpwd)を設定するときに従ったシンボリックリンクを覚えています。 command pwd(つまり、外部コマンド)は実行されません。そうすれば、あなたのために重要なことかもしれないし、そうでないかもしれない、異なる結果を得るでしょう。シンボリックリンクなしでパスを使用する場合は、pwd -Pを使用してください。

pwdドキュメントが述べていることに注意してください:

もしアプリケーションセットをまたはPWDの値を設定解除し、PWDの動作は不定です。

だから、要するに

が、ここには勝者がない:)ことを行いません。 POSIXシェルには環境変数があり、外部コマンドと同様に組み込みも可能です。あなたのニーズに最も適したものを選択してください。重要なのは、シンボリックリンクを気にするかどうかです。

+1

[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pwd.html)には、「アプリケーションがPWDの値を設定または設定解除すると、pwdの動作が指定されていません」と表示されます。あなたの答えにこれを含めることができます。どちらも選択肢が「優先」にならないことを明確にしています(シンボリックリンクが必要かどうかによって異なります) – ArjunShankar

+0

ありがとう@Arjun、編集中。 – Mat

0

それは私だったらpwdはbashとshの両方に組み込まれています。それは彼らがあらゆる点で同じように働くことを意味するわけではありませんが、オプションなしでそれを呼び出すなら、それは重要ではありません。

1

bashが利用可能でスクリプトが実行されていることがわかっている場合は、PWDは安全です。

一部のシステムでは、plain shのみが使用可能な場合は、pwdを使用してください。これに関して

2

AIX 4.2.1を比較し、そのフォーラムの記事、"$PWD vs `pwd`"から、AIX 6、のSparc Solaris 10およびRedHatの5企業:

  • $ PWDと組み込みのpwdの間に違いはありません、

  • 組み込みのpwd -Pと/ usr/bin/pwdの違いはありません。

前者はシンボリックリンクの名前で作業ディレクトリを示し、後者は実際のパスを表示します。

唯一の相違点は、外部コマンドがほとんどのシステムでは/ usr/binにあり、Redhatでは/ binにあることです。

関連する問題