20

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

PWDこれまでは環境変数を使ってパスを解析してきましたが、

  • 私はPWD常に設定されていると期待できます
  • すべてのプラットフォームで同じ結果を得る

pwdshell-builtinを使用する方が良いでしょうか? できるだけ多くのプラットフォームでこのスクリプトを実行する必要があるので、ちょっと考えてみました...

4

5 に答える 5

29

POSIX$PWDでは、次のように設定する必要があります。

PWD  

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

したがって、設定されていることに依存できますが、絶対パスではなく 「...絶対パス...」に注意してください。

bash(少なくとも最近のバージョン)は、設定$PWD(およびpwd組み込み)時にたどったシンボリックリンクを記憶します。command pwd(つまり、外部コマンド) はしません。したがって、そこではさまざまな結果が得られますが、それはあなたにとって重要である場合とそうでない場合があります。pwd -Pシンボリック リンクのないパスが必要な場合に使用します。

pwdドキュメントには次のように記載されていることに注意してください。

アプリケーションが PWD の値を設定または設定解除した場合、pwd の動作は規定されていません。

だから、それをしないでください:)

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

于 2012-05-29T07:58:46.207 に答える
4

この点に関して、AIX 4.2.1、AIX 6、Sparc Solaris 10、および Redhat 5 エンタープライズを比較したフォーラム記事「$PWD vs `pwd`」から:

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

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

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

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

于 2012-05-29T07:58:37.803 に答える
2

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

一部のシステムでプレーンな sh しか利用できない場合は、を使用しますpwd

于 2012-05-29T07:56:07.117 に答える
0

私だったら、pwdbash と sh の両方に組み込まれているので使用します。これは、すべての点で同じように機能するという意味ではありませんが、オプションなしで呼び出す場合は問題ありません。

于 2012-05-29T07:54:35.747 に答える