Saya temui BASEDIR=$(pwd)
dalam naskah.
Apakah ada kelebihan atau kekurangan dibandingkan menggunakan BASEDIR="$PWD"
, selain mungkin, yang $PWD
bisa ditimpa?
shell-script
pwd
Minix
sumber
sumber
$(pwd)
, karena$PWD
bisa menjadi ketinggalan zaman dalam keadaan tertentu.pwd
berpotensi memberi Anda informasi yang lebih sedikit basi daripada$PWD
dalam 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$PWD
dari$(pwd -P)
, itu tidak layak menggunakan$(pwd)
.cd -P -- "$dir"
. jika ada keraguan tentang nilai$PWD
Anda selalu bisacd -P .
pertama. ini mungkin juga bermanfaat karena Anda juga mendapatkan apa pun$PWD
yang sebelumnya$OLDPWD
dan kemudian dapat membandingkannya sesudahnya - dancd ...; cd -
urutan selanjutnya akan memastikan untuk membawa Anda kembali ke tempat Anda sekarang.Jawaban:
Jika bash menemukan
$(pwd)
itu akan mengeksekusi perintah pwd dan ganti$(pwd)
dengan output perintah ini.$PWD
adalah variabel yang hampir selalu disetel. pwd adalah perintah shell builtin sejak lama.Jadi
$PWD
akan 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
sumber
`command`
sintaks tidak diinginkan dan$(command)
lebih disukai. Sejauh yang saya tahu yang terakhir adalah POSIX compliant, tapi saya tidak 100% yakin.$()
memang ditentukan oleh POSIX sehingga di luar pra POSIX/bin/sh
tersedia pada Solaris 10 dancsh
shell yang lebih tua dan turunan, saya ragu banyak shell utama lain kekurangan fitur itu.$()
Perlu juga disebutkan yang
$PWD
diinginkan karena kinerjanya. Sebagai variabel shell, ini dapat diselesaikan hampir secara instan.$(pwd)
sedikit lebih membingungkan. Jika Anda memeriksaman 1 bulitin
pada sistem dengan Bash, Anda akan melihat bahwa itupwd
adalah 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: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.sumber
echo $PWD; pushd ..; echo $PWD; popd
(dengan tambahan>/dev/null
setelah setiap pernyataan), dan dibutuhkan 0,05 detik. Saya kemudian menghapus pernyataan gema (hanya pushd / popd) dan butuh 0,03. Jadi waktu perecho $PWD
itu 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.$PWD
akan dilakukan di latar belakang sebelum evaluasi pernyataan gema. Tetapi yang jelas, mengakses$PWD
masih 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. :)