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


35

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

を使用した場合に上書きさBASEDIR="$PWD"れる$PWD可能性がある以外の利点または欠点はありますか?



@StéphaneChazelas非常に興味深い記事を書いてください。私はまだ途中であり、続行しますが$(pwd)$PWD特定の状況では時代遅れになる可能性があるため、私が理解している限り、を使用する方が良いです。
ミニックス14

2
一部のシェル(bash、dash、zsh、ksh93などではない)でのみ、一部のコーナーケースpwdよりも古い情報が少なくなる可能性があります$PWD$(pwd)一方、現在のディレクトリが改行文字で終わる場合は機能しません。これは、プロセスをフォークして(ksh93を除く)、余分なリソースを使用することを意味します。私の見解は、の使用$PWDであり$(pwd -P)、使用する価値はありません$(pwd)
ステファンシャゼル14

1
一番下にあるのは、ステファンによるの使用に関する言及cd -P -- "$dir"です。$PWDあなたの価値に疑問がある場合は、常にcd -P .最初にすることができます。これは、その$PWD前にあったものも取得$OLDPWDし、後で比較できるという点でも有益です。次のcd ...; cd -シーケンスで、現在の場所に確実に戻ることができます。
mikeserv 14

回答:


41

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

したがって$PWD、この変数が設定され$(pwd)ていない場合は失敗$()し、私の経験ではほとんどの場合そうである構造をサポートしていないシェルを使用している場合は失敗します。だから私は使用します$PWD

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


6
`command`構文は望ましくなく、$(command)優先されるべきだという印象を受けました。私の知る限り、後者はPOSIX準拠ですが、100%確信はありません。
ミニックス14

6
@Minix $()はPOSIXによって実際に指定されているため/bin/sh、Solaris 10およびそれ以前のcsh派生シェルで使用可能なpre POSIX以外では、他の多くのメインストリームシェルにはその機能がありません。
jlliagre 14

@Minix:ここでは代わりにバッククォートを使って一つの問題を示し、このサイト上の最近の質問です$()
PM 2Ring

)正しい、代わりに$(あなたはバッククォートを使用することができますが、私はそれを言及しなかったので、これはカスケード接続できません
トルステンStaerk

1
チュートリアルのニースのミニ....
kbtzr

6

また$PWD、パフォーマンスのために望ましいことにも言及する必要があります。シェル変数として、ほぼ瞬時に解決できます。$(pwd)少しわかりにくいです。man 1 bulitinBashを使用してシステムを検査すると、それ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秒、通話に0.018秒かかり$PWDます。サブシェルの不必要な起動、およびその他の無関係なプロセスは、可能な限り回避する必要があります。他の言語で慣れている関数呼び出しよりもはるかに高価です。


これは興味深いことですが、シェルスクリプトのパフォーマンスが心配かどうかはわかりません。また、クエリの間にpwdが変化すると、パフォーマンスがどのように変化するのかと思います。
Minixの

@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秒かかりました。
markasoftware

あまりうるさいというわけではありません$PWDが、エコー文の評価の前にバックグラウンドで置き換えられる計算が行われると想像できます。しかし、明らかに、アクセス$PWDは依然として非常に高速であるため、互換性が問題にならない場合、これは間違いなく一方を選択する理由です。これを徹底的にテストする作業に感謝します。:)
Minix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.