スクリプトでBASEDIR=$(pwd)
に遭遇しました。
他に長所または短所はありますかBASEDIR="$PWD"
を使用すると、$PWD
が上書きされる可能性がありますか?
コメント
。
cd -P -- "$dir"
を使用したステファンの言及があります。 $PWD
の値に疑問がある場合は、いつでも最初にcd -P .
を使用できます。これは、$PWD
が$OLDPWD
でその前にあったものをすべて取得し、後でそれらを比較できるという点でも有益な場合があります-そして次のcd ...; cd -
シーケンスにより、現在の場所に確実に戻ることができます。回答
bashが$(pwd)
を検出すると、コマンドpwdを実行し、$(pwd)
をこのコマンドの出力に置き換えます。$PWD
は、ほとんどの場合に設定される変数です。pwdは、長い間組み込まれているシェルコマンドです。
つまり、$PWD
この変数が設定されていない場合は失敗し、$()
コンストラクトをサポートしていないシェルを使用している場合は$(pwd)
が失敗します。私の経験ではよくあることです。そのため、$PWD
を使用します。
すべてのオタクとして、私は独自のを持っています。シェルスクリプトチュートリアル
コマンドnts
-
`command`
の構文は望ましくなく、$(command)
が優先されます。私の知る限り、後者はPOSIXに準拠していますが、' 100%確実ではありません。 - @Minix
$()
は確かにPOSIXによって指定されているため、Solaris10以前およびcsh
派生シェルで使用可能なPOSIX以前の/bin/sh
以外では、多くのことを疑っています。他の主流のシェルにはその機能がありません。 - @Minix:このサイトの最近の質問は、代わりにバックティックを使用する際の1つの問題を示しています。
$()
- 正しい、$()の代わりにバックティックを使用できますが、これはカスケード可能ではないため、言及しませんでした
- チュートリアルのミニマップ…
回答
$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
へのアクセスは非常に高速であるため、互換性が問題にならない場合は、これが間違いなくどちらかを選択する理由です。 これを徹底的にテストしてくれてありがとう。 🙂
$(pwd)
、$PWD
は特定の状況で古くなる可能性があるため。pwd
は、場合によっては$PWD
よりも古い情報を提供しない可能性があります。一方、$(pwd)
は'現在のディレクトリが改行文字で終わっている場合は機能しません。つまり、プロセスをフォークすることを意味します(ksh93を除く)。追加のリソースを使用します。私の見解では、$(pwd -P)
の$PWD
を使用していますが、'は