$(pwd)または$ PWDを使用する方が良いですか?

スクリプトでBASEDIR=$(pwd)に遭遇しました。

他に長所または短所はありますかBASEDIR="$PWD"を使用すると、$PWDが上書きされる可能性がありますか?

コメント

  • unix.stackexchange.com/a/79621
  • @St phaneChazelas非常に興味深い記事。 'は途中で続行しますが、私が理解している限り、'は$(pwd)$PWDは特定の状況で古くなる可能性があるため。
  • 一部のシェルでのみ(bash、dash、zsh、ksh93ではない)インスタンス)pwdは、場合によっては$PWDよりも古い情報を提供しない可能性があります。一方、$(pwd)は'現在のディレクトリが改行文字で終わっている場合は機能しません。つまり、プロセスをフォークすることを意味します(ksh93を除く)。追加のリソースを使用します。私の見解では、$(pwd -P)$PWDを使用していますが、'は

  • 下部に、cd -P -- "$dir"を使用したステファンの言及があります。 $PWDの値に疑問がある場合は、いつでも最初にcd -P .を使用できます。これは、$PWD$OLDPWDでその前にあったものをすべて取得し、後でそれらを比較できるという点でも有益な場合があります-そして次のcd ...; cd -シーケンスにより、現在の場所に確実に戻ることができます。
  • 回答

    bashが$(pwd)を検出すると、コマンドpwdを実行し、$(pwd)をこのコマンドの出力に置き換えます。$PWDは、ほとんどの場合に設定される変数です。pwdは、長い間組み込まれているシェルコマンドです。

    つまり、$PWDこの変数が設定されていない場合は失敗し、$()コンストラクトをサポートしていないシェルを使用している場合は$(pwd)が失敗します。私の経験ではよくあることです。そのため、$PWDを使用します。

    すべてのオタクとして、私は独自のを持っています。シェルスクリプトチュートリアル

    コマンドnts

    回答

    $PWDは、そのパフォーマンスのために望ましいものです。シェル変数として、ほぼ瞬時に解決できます。 $(pwd)はもう少し混乱します。 Bashを搭載したシステムでman 1 bulitinを調べると、pwdが組み込みコマンドであることがわかります。変数にアクセスするのと同じくらい高速になると信じています。ただし、$()コンストラクトは、内容に関係なく、常に新しいサブシェル(新しいプロセス)を起動してコンテンツを実行します。 。同じことがバックティックにも当てはまります。実際、ベンチマークすると:

    echo "Benchmarking $(pwd)..." time (for i in {1..1000}; do echo $(pwd) > /dev/null; done) echo "Benchmarking $PWD..." time (for i in {1..1000}; do echo $PWD > /dev/null; done) 

    $(pwd)の呼び出しで1.52秒、$(pwd)の呼び出しで0.018秒になります。 div id = “1fdedb4aa6″>

    。サブシェルの不必要な起動、およびその他の無関係なプロセスは、可能な限り回避する必要があります。これらは、「他の言語で慣れている関数呼び出しよりもはるかに高価です。

    コメント

    • その'は興味深い見方ですが、'シェルスクリプトのパフォーマンスが心配かどうかはわかりません。また、パフォーマンスがどのように変化するのか疑問に思います。クエリの間にpwdが変化します。
    • @Minixループ本体がecho $PWD; pushd ..; echo $PWD; popdになるようにスクリプトを変更しました(追加の>/dev/null各ステートメントの後に)、0.05秒かかります。次にechoステートメント(pushd / popdのみ)を削除すると、0.03かかりました。したがって、echo $PWDあたりの時間はまだ0.01秒程度でした。 $(pwd)で同様のことを行いましたが、ループごとに2.2秒かかったため、$(pwd)の呼び出しごとに1.1秒かかりました。
    • あまりうるさくはありませんが、$PWDを置き換える計算は、エコーステートメントの評価の前にバックグラウンドで実行されると想像できます。 ただし、明らかに、$PWDへのアクセスは非常に高速であるため、互換性が問題にならない場合は、これが間違いなくどちらかを選択する理由です。 これを徹底的にテストしてくれてありがとう。 🙂

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です