Tại sao bắt đầu một lệnh shell với dấu gạch chéo ngược?


Câu trả lời:


200
alias curl='curl --some --default --options'

Nếu bạn có bí danh curlvà bạn không muốn sử dụng nó, đặt dấu gạch chéo ngược ở phía trước sẽ vô hiệu hóa bí danh và chạy trực tiếp nhị phân curl.

Lưu ý rằng điều này chỉ áp dụng tại một vỏ tương tác. Các bí danh không có hiệu lực trong các kịch bản vì vậy nó sẽ không cần thiết ở đó.


4
Bí danh có thể được sử dụng trong các tập lệnh bằng cách sử dụng shopt -s expand_aliasestrước khi sử dụng bí danh
Alex

@lbaby Tương tự ở Kornshell. Bạn xử lý một bí danh lệnh có thể bằng cách đặt dấu gạch chéo ngược trước nó. Điều này rất phổ biến ở Kornshell khi mọi người định nghĩa các dấu nhắc lệnh với tên của thư mục trong đó . Lưu ý dòng đầu tiên của hàm này là `\ cd" $ @ "`.
David W.

1
Điều đáng chú ý là \curlkhông bỏ qua bất kỳ hàm shell nào được đặt tên curl. Vì thế, bạn có thể sử dụng lệnh bash tích hợp command:command curl ...
Keith Thompson

7
Một cách dễ hiểu hơn để viết \curl ...command curl ...
glenn jackman

Lưu ý rằng dash(và có thể các shell khác, mặc dù bạn đúng bashmà không có expand_aliases) sẽ mở rộng bí danh trong các tập lệnh.
Adrian Günter

163

Đặc tả vỏ (Bourne / POSIX) nói rằng sự thay thế bí danh trong một vỏ tương tác bị triệt tiêu khi bất kỳ ký tự nào của từ lệnh được trích dẫn. Dấu gạch chéo ngược là một cách để làm điều đó, nhưng cũng có những cách khác để biết: trích dẫn đơn và kép. Tất cả những điều sau đây sẽ ngăn chặn sự thay thế bí danh:

 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"

Sử dụng \curlchỉ là cách phổ biến nhất và dễ đọc. Vì đây là một tính năng được tiêu chuẩn hóa, bạn có thể mong đợi nó hoạt động trong tất cả các vỏ di sản Bourne.

\curltrông hơi giống lệnh TeX, phải không? :-)


14
+1 vì đã đưa ra lý do cụ thể tại sao \curlbỏ qua một bí danh cùng tên; lưu ý rằng chỉ các bí danh được bỏ qua theo cách này, không phải các hàm shell ; command curl ...sẽ đảm bảo bỏ qua một trong hai .
mkuity0

1
Tôi không thấy điểm của câu cuối cùng. Nhân tiện, bạn chỉ đề cập đến việc bỏ qua các bí danh , nhưng bất kỳ loại trích dẫn nào cũng sẽ bỏ qua các từ khóa.
gniourf_gniourf

@ mkuity0 Không hoàn toàn đảm bảo command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"bản in Not command, lol!x 3.
Adrian Günter

3
@ AdrianGünter: Có, nếu bạn command tự thay thế bằng chức năng shell, bạn đang đánh bại cơ chế. Những gì ví dụ của bạn cho thấy là \ không bỏ qua các chức năng , như đã nêu. Một ví dụ không tự đánh bại : date() { echo 'not date'; }; date; command date. Nếu bạn đang lo lắng về nguy hiểm giả mạo với command, xem stackoverflow.com/a/35931876/45375
mklement0

@ mkuity0 Tôi hiểu tất cả điều đó, nhưng quan điểm của tôi là nếu người ta không thể đảm bảo rằng bất kỳ tên lệnh nào khác không tồn tại dưới dạng hàm (nghĩa là bạn thiếu kiểm soát đối với môi trường thực thi của mình), thì người ta cũng không thể dựa vào commandđể không bị ghi đè. Từ liên kết của riêng bạn:Thus, with no control over the execution environment, you cannot write shell scripts that are fully immune to tampering, unless you know that your code will be executed by dash, ksh, or bash (with the workaround in place)
Adrian Günter
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.