Câu trả lời:
Đây là một backtick . Một backtick không phải là một dấu hiệu trích dẫn. Nó có một ý nghĩa rất đặc biệt. Mọi thứ bạn nhập giữa các backticks đều được đánh giá (được thực thi) bởi shell trước lệnh chính (như chown
trong ví dụ của bạn) và đầu ra của thực thi đó được sử dụng bởi lệnh đó, giống như khi bạn nhập đầu ra đó vào vị trí đó trong dòng lệnh.
Vậy thì sao
sudo chown `id -u` /somedir
chạy hiệu quả (tùy thuộc vào ID người dùng của bạn ) là:
sudo chown 1000 /somedir
\ \ \ \
\ \ \ `-- the second argument to "chown" (target directory)
\ \ `-- your user ID, which is the output of "id -u" command
\ `-- "chown" command (change ownership of file/directory)
`-- the "run as root" command; everything after this is run with root privileges
Hãy xem câu hỏi này để tìm hiểu lý do tại sao, trong nhiều tình huống, không nên sử dụng backticks.
Btw, nếu bạn đã từng muốn sử dụng backtick theo nghĩa đen, ví dụ như trong một chuỗi, bạn có thể thoát nó bằng cách đặt dấu gạch chéo ngược ( \
) trước nó.
$()
trong hầu hết các tình huống, nhưng nó không làm cho backticks trở thành một điều tồi tệ hơn . Đối với các mục đích thực tế, người ta phải thừa nhận rằng họ gõ nhanh hơn nhiều trên dòng lệnh (2 lần nhấn phím so với ít nhất 5, bao gồm Shift
).
$( )
chắc chắn dễ gõ hơn ` `
ít nhất là trên bàn phím tiếng Pháp.
Tôi muốn thêm vài điểm ở đây.
Backtick `…`
thực sự được gọi là thay thế lệnh . Mục đích của việc thay thế lệnh là để đánh giá lệnh được đặt bên trong backtick và cung cấp kết quả của nó như là một đối số cho lệnh thực tế.
Việc thay thế lệnh có thể được thực hiện theo hai cách một là sử dụng $(…)
và cách khác là `…`
. Cả hai đều hoạt động như nhau, nhưng $(…)
hình thức là cách hiện đại và có sự rõ ràng và dễ đọc hơn.
Và như vậy
sudo chown $(id -u) /somedir
có thể được ưa thích hơn khác.
Và một điều nữa bạn cần lưu ý ở đây là mối quan hệ thay thế lệnh với các quy tắc trích dẫn bash như được đề cập trong tài liệu bash .
Nếu sự thay thế xuất hiện trong dấu ngoặc kép, việc tách từ và mở rộng tên tệp sẽ không được thực hiện trên kết quả.
$(...)
tổ tốt hơn.
$()
và "``"
không hoạt động theo cùng một cách
Một lưu ý làm rõ hiếm khi được đề cập:
Backticks (đôi khi còn được gọi là Graves vì nó tăng gấp đôi như một giọng phổ biến trong tiếng Pháp và các ngôn ngữ khác) chỉ thay thế Đầu ra tiêu chuẩn , nhưng không phải là Lỗi tiêu chuẩn.
Vì vậy, để tiếp tục ví dụ trước:
file `which hostname`
sẽ làm việc như mong đợi, nhưng trong:
file `which hostnameX`
which
sẽ trả về một lỗi và đầu ra đó chuyển sang lỗi tiêu chuẩn, thay vì thay thế vào dòng lệnh bên cạnh file
; sẽ không có đầu ra tiêu chuẩn nào cả, mà bạn có thể xác nhận bằng cách chạy:
which hostnameX
which hostnameX 2>/dev/null
Trong trường hợp này,
file `which hostnameX`
sẽ tạo ra hai thông báo lỗi (cái đầu tiên, do which hostnameX
và cái thứ hai ngay sau cái trước, do chính tệp đó, phát hiện ra rằng tên tệp bị thiếu và do đó, toàn bộ lệnh
về cơ bản sẽ giảm xuống chỉ:
file
trong đó, tất nhiên, là sử dụng kém và sẽ trả về lỗi sử dụng.
(nếu bạn muốn tự mình kiểm tra, bạn có thể thử:
file `which hostnameX 2>/dev/null` # just the file-command bad-usage error msg is printed
file `which hostnameX 2>/dev/null` 2>/dev/null # now nothing is printed on the screen :)
Backtick `chạy nội dung của chuỗi đính kèm, vì vậy một cái gì đó như thế này
file `which hostname`
sẽ tìm ra đường dẫn đến lệnh hostname, và sau đó cho bạn biết nó được xây dựng như thế nào.
Lệnh mà bạn đặt trong câu hỏi của bạn chạy id -u
để có được id người dùng hiệu quả và sau đó thay đổi quyền sở hữu / somedir cho người dùng đó.
Các backticks giống như thay thế lệnh. Cú pháp backticks này là cổ xưa và biết ký hiệu đô la với hai dấu ngoặc đơn là phổ biến : $()
.
Thay thế lệnh là một hoạt động đơn lẻ với cú pháp chuyên dụng để vừa thực thi một lệnh và để đầu ra của nó được lưu trữ vào một biến để sử dụng sau này.
thedate=$(date)
Sau đó, chúng tôi có thể in kết quả: 'Ngày là% s \ n' "$ thedate" `.
$()
.date
.$(date)
đầu ra của nó là sự thay thế.printf
, theo lệnh trên.
$(your expression)
là một cách tốt hơn để làm điều tương tự như$()
cho phép bạn lồng các biểu thức. ví dụ:cd $(dirname $(type -P touch))
sẽ đưa bạn vào thư mục chứatouch
lệnh