Tại sao tôi phải thoát khỏi một chấm dot hai lần?


13

Tôi biết rằng chúng ta có thể thoát khỏi một nhân vật đặc biệt như *(){}$với \để được coi literals.
Ví dụ \*hay\$

Nhưng trong trường hợp .tôi phải làm điều đó hai lần, như \\.thể nó được coi là nhân vật đặc biệt. Thí dụ:

man gcc | grep \\.

Tại sao nó như vậy?


Bạn có thể đưa ra trường hợp mà bạn phải trốn thoát hai lần?
cuonglm

man bash|grep \\.có thể là một ví dụ.
Người dùng đã đăng ký

3
Chính xác hơn, bạn không thoát dấu chấm hai lần, bạn thoát khỏi ký tự thoát để nó được chuyển đến grep
Cthulhu

5
Bạn có thể sử dụng dấu ngoặc kép để tránh thoát ký tự dấu gạch chéo : man gcc | grep '\.'.
Leonid Beschastny

1
Tôi thực sự thích đề xuất của @ LeonidBeschastny vì nó rõ ràng hơn những gì đang diễn ra
Izkata

Câu trả lời:


24

Nói chung, bạn chỉ phải thoát một lần để làm cho nhân vật đặc biệt được coi là nghĩa đen. Đôi khi bạn phải làm điều đó hai lần, bởi vì mô hình của bạn được sử dụng bởi nhiều hơn một chương trình.

Hãy bỏ qua ví dụ của bạn:

man gcc | grep \\.

Lệnh này được giải thích bởi hai chương trình, bashthông dịch viên và grep. Nguyên nhân thoát đầu tiên bashbiết \là theo nghĩa đen, vì vậy thứ hai là thông qua grep.

Nếu bạn thoát khỏi một lần duy nhất, \., bashsẽ biết dấu chấm này là theo nghĩa đen, và vượt qua .để grep. Khi grepnhìn thấy điều này ., nó nghĩ rằng dấu chấm là ký tự đặc biệt, không phải theo nghĩa đen.

Nếu bạn thoát khỏi hai lần, bashsẽ vượt qua mô hình \.để grep. Bây giờ grepbiết rằng đó là một dấu chấm theo nghĩa đen.


: Vì vậy, ký tự thoát cho dấu chấm có phụ thuộc vào số lượng đường ống chúng ta sử dụng không?. Ví dụ: cmd | cmd | cmd | cmd \\\\. Đúng không????
Do đó,

6
@Thushi: Không. Điều này không liên quan gì đến thực tế là bạn đang sử dụng một (hoặc một vài) ký tự ống, nhưng áp dụng ngay cả cho grep \\. my_file. Dòng lệnh được giải thích bởi shell, sử dụng cái đầu tiên \ để thoát cái thứ hai, vì vậy một cái \ được truyền theo nghĩa đen cho grep. Dấu chấm .không đặc biệt đối với hệ vỏ, vì vậy dù sao nó cũng được thông qua nguyên văn. Grep sau đó đọc (đơn) \ và sử dụng nó để thoát dấu chấm ..
Ansgar Esztermann

@AnsgarEsztermann: Vâng. Đó là sự thật. Hãy xem thử. Cảm ơn :)
Vì vậy,

2
Tôi tin rằng câu trả lời có phần không chính xác ở chỗ nó nói rằng "Lối thoát đầu tiên gây ra bash biết. Là nghĩa đen, thứ hai là cho grep." Trên thực tế, lối thoát đầu tiên cho phép bash biết rằng \ là đơn vị và vượt qua \. để grep.
Cthulhu

@ Tôi không nghĩ nó có. echo .trong bash chỉ ... tiếng vang .nhân vật bach .
Cthulhu
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.