Sử dụng $ (pwd) hay $ PWD tốt hơn?


35

Tôi gặp BASEDIR=$(pwd)trong một kịch bản.

Có bất kỳ lợi thế hoặc bất lợi nào khi sử dụng BASEDIR="$PWD", ngoài việc $PWDcó thể bị ghi đè không?


3
một số thông tin tại unix.stackexchange.com/a/79621
Stéphane Chazelas

@ StéphaneChazelas Rất thú vị viết lên. Tôi chỉ mới đi được nửa chặng đường và sẽ tiếp tục, nhưng theo như tôi hiểu thì tốt hơn nên sử dụng $(pwd), vì $PWDcó thể trở nên lỗi thời trong một số trường hợp nhất định.
Minix

2
chỉ trong một số shell (chẳng hạn như bash, dash, zsh hoặc ksh93) sẽ pwdcó khả năng cung cấp cho bạn ít thông tin cũ hơn $PWDtrong một số trường hợp góc. $(pwd)mặt khác không hoạt động nếu thư mục hiện tại kết thúc bằng các ký tự dòng mới, có nghĩa là bỏ qua một quá trình (ngoại trừ trong ksh93) và sử dụng các tài nguyên bổ sung. Quan điểm của tôi là sử dụng $PWDcủa $(pwd -P), nó không phải là giá trị sử dụng $(pwd).
Stéphane Chazelas

1
ở phía dưới có đề cập đến stephane sử dụng cd -P -- "$dir". nếu có bất kỳ nghi ngờ gì về giá trị của $PWDbạn luôn có thể cd -P .đầu tiên. điều này cũng có thể có lợi ở chỗ bạn cũng nhận được bất cứ điều gì $PWDtrước đó $OLDPWDvà do đó có thể so sánh chúng sau đó - và cd ...; cd -trình tự tiếp theo sẽ chắc chắn đưa bạn trở lại nơi bạn đang ở.
mikeerv

Câu trả lời:


41

Nếu bash gặp $(pwd)nó, nó sẽ thực thi lệnh pwd và thay thế $(pwd)bằng đầu ra của lệnh này. $PWDlà một biến gần như luôn luôn được đặt. pwd là một lệnh shell dựng sẵn từ rất lâu.

Vì vậy, $PWDsẽ thất bại nếu biến này không được đặt và $(pwd)sẽ thất bại nếu bạn đang sử dụng trình bao không hỗ trợ $()cấu trúc mà theo kinh nghiệm của tôi khá thường xuyên. Vì vậy, tôi sẽ sử dụng $PWD.

Như mọi mọt sách tôi có hướng dẫn kịch bản shell của riêng mình


6
Tôi có ấn tượng rằng `command`cú pháp là không mong muốn và $(command)được ưa thích. Theo như tôi biết thì cái sau này tuân thủ POSIX, nhưng tôi không chắc chắn 100%.
Minix

6
@Minix $()Thực sự được chỉ định bởi POSIX vì vậy ngoài POSIX trước /bin/shcó sẵn trên Solaris 10 trở lên và các cshvỏ có nguồn gốc, tôi nghi ngờ nhiều vỏ chính khác thiếu tính năng đó.
jlliagre

@Minix: Đây là một câu hỏi gần đây trên trang web này minh họa một vấn đề với việc sử dụng backticks thay vì$()
PM 2Ring

đúng, thay vì $ () bạn có thể sử dụng backticks, nhưng điều này sẽ không thể ghép được vì vậy tôi đã không đề cập đến nó
Thorsten Staerk

1
Bản đồ nhỏ đẹp trên hướng dẫn của bạn ....
kbtzr

6

Nó cũng nên được đề cập đó $PWDlà mong muốn vì hiệu suất của nó. Là một biến shell, nó có thể được giải quyết gần như ngay lập tức. $(pwd)khó hiểu hơn một chút. Nếu bạn kiểm tra man 1 bulitintrên một hệ thống với Bash, bạn sẽ thấy đó pwdlà một lệnh tích hợp, điều này có thể khiến bạn tin rằng nó sẽ nhanh như truy cập vào một biến. Tuy nhiên, $()cấu trúc luôn khởi chạy một lớp con mới (một quy trình mới) để chạy nội dung của nó, bất kể những gì bên trong. Điều tương tự cũng xảy ra với backticks. Thật vậy, khi tôi điểm chuẩn nó:

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)

Tôi nhận được 1,52 giây cho $(pwd)cuộc gọi và 0,008 giây cho $PWD. Không nên khởi động các subshells không cần thiết, cũng như bất kỳ quá trình ngoại lai nào khác, bất cứ khi nào có thể. Chúng đắt hơn nhiều so với các cuộc gọi chức năng mà bạn có thể được sử dụng trong các ngôn ngữ khác.


Đó là một điều thú vị về nó, nhưng tôi không biết liệu tôi có lo ngại về hiệu suất trên các kịch bản shell của mình không. Tôi cũng tự hỏi làm thế nào hiệu suất sẽ thay đổi, nếu pwd thay đổi giữa các truy vấn nó.
Minix

@Minix Tôi đã sửa đổi tập lệnh của mình để có thân vòng lặp echo $PWD; pushd ..; echo $PWD; popd(có thêm >/dev/nullsau mỗi câu lệnh) và mất 0,05 giây. Sau đó tôi đã loại bỏ các câu lệnh echo (chỉ Pushd / popd) và mất 0,03. Vì vậy, thời gian cho mỗi echo $PWDvẫn là 0,01 giây hoặc lâu hơn. Tôi đã làm một cái gì đó tương tự $(pwd), và mất 2,2 giây cho mỗi vòng lặp, vì vậy 1,1 giây cho mỗi $(pwd)cuộc gọi.
markasoftware

Không quá cầu kỳ, nhưng tôi có thể tưởng tượng rằng việc tính toán, sẽ thay thế $PWDsẽ được thực hiện trong nền trước khi đánh giá các báo cáo tiếng vang. Nhưng rõ ràng, việc truy cập $PWDvẫn nhanh hơn đáng kể, vì vậy nếu khả năng tương thích không phải là vấn đề đáng lo ngại, đây chắc chắn là một lý do để chọn cái này hơn cái kia. Cảm ơn cho công việc kiểm tra này rất kỹ lưỡng. :)
Minix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.