it-swarm-vi.com

Sự khác biệt giữa $ (thứ) và `Stuff` là gì?

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)top -p `pidof init` cho cùng một đầu ra. Có phải hai cách này làm cùng một việc, hoặc có sự khác biệt?

270
tshepang

Các backquote kiểu cũ _` `_ thực hiện xử lý dấu gạch chéo ngược và lồng một chút khác nhau. Kiểu $() kiểu mới diễn giải mọi thứ ở giữa _( )_ dưới dạng 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 $() kiểu mới áp dụng cho tất cả [~ # ~] posix [~ # ~] - shell phù hợp.
[.__.] Như mouviciel đã chỉ ra, kiểu cũ _` `_ có thể cần thiết cho các vỏ cũ hơn.

Ngoài quan điểm kỹ thuật, kiểu cũ _` `_ cũng có một nhược điểm về thị giác:

  • Khó để ý: I like $(program) better than `program`
  • Dễ bị nhầm lẫn với một trích dẫn: _'`'`''`''`'`''`'_
  • Không dễ để gõ (thậm chí có thể không phải trên bố cục tiêu chuẩn của bàn phím)

(và SE sử dụng _` `_ cho mục đích riêng, thật khó để viết câu trả lời này :)

364
wag

Sự khác biệt rõ ràng tôi quan sát thấy 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ự, .source lệnh là từ đồng nghĩa.

41
balki

$() không hoạt động với Bourne Shell cũ. Nhưng nó đã được năm nhiều thập kỷ kể từ khi tôi làm việc với Bourne Shell cũ.

28
mouviciel

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 Làm chủ kịch bản Unix Shell , 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".

6
cuonglm

Để 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 (Cũng lưu ý các bình luận bên dưới bài đăng đó.)

5
phk

Cú pháp $() sẽ không hoạt động với Shell bourne cũ.
[.__.] Với các shell mới hơn ` `$() tương đương nhưng $() thuận tiện hơn nhiều khi sử dụng 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 \\\`\``
1
Emmanuel