Apakah lebih baik menggunakan $ (pwd) atau $ PWD?

35

Saya temui BASEDIR=$(pwd)dalam naskah.

Apakah ada kelebihan atau kekurangan dibandingkan menggunakan BASEDIR="$PWD", selain mungkin, yang $PWDbisa ditimpa?

Minix
sumber
3
beberapa info di unix.stackexchange.com/a/79621
Stéphane Chazelas
@ StéphaneChazelas Tulisan yang sangat menarik. Saya hanya setengah jalan dan akan terus, tetapi sejauh yang saya mengerti, lebih baik digunakan $(pwd), karena $PWDbisa menjadi ketinggalan zaman dalam keadaan tertentu.
Minix
2
hanya di beberapa shell (bukan bash, dash, zsh atau ksh93 misalnya) yang pwdberpotensi memberi Anda informasi yang lebih sedikit basi daripada $PWDdalam beberapa kasus sudut. $(pwd)di sisi lain tidak berfungsi jika direktori saat ini berakhir dengan karakter baris baru, berarti proses forking (kecuali di ksh93) dan menggunakan sumber daya tambahan. Pandangan saya adalah penggunaan $PWDdari $(pwd -P), itu tidak layak menggunakan $(pwd).
Stéphane Chazelas
1
di bagian bawah ada stephane yang menyebutkan menggunakan cd -P -- "$dir". jika ada keraguan tentang nilai $PWDAnda selalu bisa cd -P .pertama. ini mungkin juga bermanfaat karena Anda juga mendapatkan apa pun $PWDyang sebelumnya $OLDPWDdan kemudian dapat membandingkannya sesudahnya - dan cd ...; cd -urutan selanjutnya akan memastikan untuk membawa Anda kembali ke tempat Anda sekarang.
mikeserv

Jawaban:

41

Jika bash menemukan $(pwd)itu akan mengeksekusi perintah pwd dan ganti $(pwd)dengan output perintah ini. $PWDadalah variabel yang hampir selalu disetel. pwd adalah perintah shell builtin sejak lama.

Jadi $PWDakan gagal jika variabel ini tidak disetel dan $(pwd)akan gagal jika Anda menggunakan shell yang tidak mendukung $()konstruk yang menurut pengalaman saya cukup sering terjadi. Jadi saya akan gunakan $PWD.

Karena setiap kutu buku saya punya tutorial scripting shell saya sendiri

Thorsten Staerk
sumber
6
Saya mendapat kesan bahwa `command`sintaks tidak diinginkan dan $(command)lebih disukai. Sejauh yang saya tahu yang terakhir adalah POSIX compliant, tapi saya tidak 100% yakin.
Minix
6
@Minix $()memang ditentukan oleh POSIX sehingga di luar pra POSIX /bin/shtersedia pada Solaris 10 dan cshshell yang lebih tua dan turunan, saya ragu banyak shell utama lain kekurangan fitur itu.
jlliagre
@Minix: Berikut adalah pertanyaan terbaru di situs ini yang menggambarkan satu masalah dengan menggunakan backticks alih-alih$()
PM 2Ring
benar, alih-alih $ () Anda bisa menggunakan backticks, tetapi ini tidak akan dapat di-cascadable jadi saya tidak menyebutkannya
Thorsten Staerk
1
Minimap
6

Perlu juga disebutkan yang $PWDdiinginkan karena kinerjanya. Sebagai variabel shell, ini dapat diselesaikan hampir secara instan. $(pwd)sedikit lebih membingungkan. Jika Anda memeriksa man 1 bulitinpada sistem dengan Bash, Anda akan melihat bahwa itu pwdadalah perintah bawaan, yang dapat membuat Anda percaya bahwa itu akan sama cepatnya dengan mengakses variabel. Namun, $()konstruk selalu meluncurkan subkulit baru (proses baru) untuk menjalankan kontennya, terlepas dari apa yang ada di dalamnya. Hal yang sama berlaku untuk backticks. Memang, ketika saya membandingkannya:

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)

Saya mendapat 1,52 detik untuk $(pwd)panggilan dan 0,018 detik untuk $PWD. Peluncuran subkulit yang tidak perlu, serta proses asing lainnya, harus dihindari sedapat mungkin. Mereka jauh lebih mahal daripada panggilan fungsi yang mungkin Anda gunakan dalam bahasa lain.

perangkat lunak markas
sumber
Itu hal yang menarik, tetapi saya tidak tahu apakah saya khawatir dengan kinerja pada skrip shell saya. Saya juga bertanya-tanya bagaimana kinerja akan berubah, jika perubahan pwd di antara permintaan itu.
Minix
@Minix Saya memodifikasi skrip untuk membuat loop body menjadi echo $PWD; pushd ..; echo $PWD; popd(dengan tambahan >/dev/nullsetelah setiap pernyataan), dan dibutuhkan 0,05 detik. Saya kemudian menghapus pernyataan gema (hanya pushd / popd) dan butuh 0,03. Jadi waktu per echo $PWDitu masih 0,01 detik atau lebih. Saya melakukan sesuatu yang mirip $(pwd), dan butuh 2,2 detik untuk setiap loop, jadi 1,1 detik per $(pwd)panggilan.
markasoftware
Tidak terlalu pilih-pilih, tetapi saya bisa membayangkan, bahwa perhitungan, yang akan menggantikan $PWDakan dilakukan di latar belakang sebelum evaluasi pernyataan gema. Tetapi yang jelas, mengakses $PWDmasih jauh lebih cepat, jadi jika kompatibilitas tidak menjadi masalah, ini jelas merupakan alasan untuk memilih satu dari yang lain. Terima kasih atas kerja dalam menguji ini dengan saksama. :)
Minix