Có hai cú pháp để thay thế lệnh: với dấu ngoặc đơn và với backticks. Chạy top -p $(pidof init)
và top -p `pidof init`
cho cùng một đầu ra. Có phải hai cách làm cùng một điều, hoặc có sự khác biệt?
Có hai cú pháp để thay thế lệnh: với dấu ngoặc đơn và với backticks. Chạy top -p $(pidof init)
và top -p `pidof init`
cho cùng một đầu ra. Có phải hai cách làm cùng một điều, hoặc có sự khác biệt?
Câu trả lời:
Các backquote kiểu cũ ` `
xử lý dấu gạch chéo ngược và lồng một chút khác nhau. Kiểu mới $()
diễn giải mọi thứ ở giữa ( )
như một lệnh.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
hoạt động nếu các backquote lồng nhau được thoát:
echo `uname | \`echo cat\``
Linux
dấu gạch chéo vui:
echo $(echo '\\')
\\
echo `echo '\\'`
\
Kiểu mới $()
áp dụng cho tất cả các vỏ phù hợp POSIX .
Như mouviciel đã chỉ ra, kiểu cũ ` `
có thể cần thiết cho đạn pháo cũ.
Ngoài quan điểm kỹ thuật, kiểu cũ ` `
cũng có nhược điểm về thị giác:
I like $(program) better than `program`
'`'`''`''`'`''`'
(và SE sử dụng ` `
cho mục đích riêng, thật đau đớn khi viết câu trả lời này :)
{ }
thường được gọi là "dấu ngoặc nhọn" hoặc "niềng răng" en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
là một phím chết, vì vậy tôi phải gõ một backtick đôi (một điều tôi thường quên tôi thậm chí có thể làm) hoặc backtick sau đó là dấu cách, đó là một đau đớn.
Rõ ràng sự khác biệt tôi quan sát là bạn không thể lồng backticks trong khi bạn có thể lồng $()
. Có lẽ cả hai tồn tại vì lý do di sản. Tương tự, các lệnh .
và source
là từ đồng nghĩa.
source
. Dash là một ví dụ.
$(...)
và `...`
đều là tiêu chuẩn (cái sau bị phản đối) trong khi .
là tiêu chuẩn nhưng không phảisource
(t)csh
chúng không thể được lồng nhau. (t)csh
không hỗ trợ $(...)
mặc dù. Họ hỗ trợ source
(và không .
) mặc dù.
$()
không hoạt động với vỏ Bourne cũ. Nhưng đã nhiều năm trôi qua kể từ khi tôi làm việc với vỏ Bourne cũ.
Một lưu ý khác, $()
sẽ sử dụng nhiều tài nguyên hệ thống hơn là sử dụng backticks, nhưng nhanh hơn một chút.
Trong việc làm chủ kịch bản shell Unix , Randal K. Michael đã thực hiện một thử nghiệm trong một chương có tên "24 cách để xử lý từng dòng một tệp".
$()
làm cho tập lệnh của bạn lớn hơn một byte so với khi nó được sử dụng `
(giả sử bạn không lồng chúng và không sử dụng dấu gạch chéo ngược trong). Vì nó sẽ nhanh hơn để phân tích cú pháp, điều đó sẽ khác nhau giữa các đạn pháo và sẽ không liên quan vì không đáng kể so với chi phí tạo ra một đường ống và từ bỏ quá trình thay thế lệnh.
Để thêm vào những gì người khác nói ở đây, bạn có thể sử dụng backticks để mô phỏng các bình luận nội tuyến:
echo foo `# I'm a comment!` bar
Đầu ra là : foo bar
.
Xem phần sau để biết thêm thông tin: https://stackoverflow.com/a/12797512 (Lưu ý cả những bình luận bên dưới bài đăng đó.)
Các $()
cú pháp sẽ không làm việc với vỏ bourne cũ.
Với các shell mới hơn ` `
và $()
tương đương nhưng $()
sử dụng thuận tiện hơn nhiều khi bạn cần lồng nhiều lệnh.
Ví dụ :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
dễ gõ và gỡ lỗi hơn:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``