Dấu gạch chéo ngược có nghĩa là gì?


17

Một phần mềm tôi đã cài đặt đã chèn một dòng trong hồ sơ của tôi có nội dung:

[ -s "$SOME_FILE" ] && \. "$SOME_FILE"

Tôi biết dấu chấm .đồng nghĩa với source, vì vậy tôi nghi ngờ đây chỉ là tìm nguồn cung cấp tệp, nhưng tôi chưa từng thấy \.trước đây; nó có làm gì khác không?

Chỉnh sửa, liên quan đến DV: tìm kiếm "dấu gạch chéo ngược" dẫn đến các câu hỏi liên quan đến ./khi gọi các tệp thực thi và man sourcedẫn đến một trang chủ \.không xuất hiện. Tôi không biết những gì khác để thử, do đó câu hỏi.

Chỉnh sửa 2: xem các câu hỏi liên quan

Câu trả lời:


31

Dấu gạch chéo ngược bên ngoài dấu ngoặc kép có nghĩa là diễn giải các ký tự tiếp theo theo nghĩa đen trong khi phân tích cú pháp. Vì .là một ký tự bình thường cho trình phân tích cú pháp, \.được phân tích cú pháp theo cùng một cách .và gọi hàm dựng sẵn .(trong đó sourcelà một từ đồng nghĩa trong bash).

Có một trường hợp nó có thể tạo ra sự khác biệt trong bối cảnh này. Nếu người dùng đã xác định một bí danh được gọi .trước đó .profile.profileđang được đọc trong một vỏ mở rộng các bí danh (mà bash chỉ làm theo mặc định khi nó được gọi tương tác), thì .sẽ kích hoạt bí danh, nhưng \.vẫn sẽ kích hoạt nội dung, bởi vì trình bao không thử mở rộng bí danh trên các từ được trích dẫn theo bất kỳ cách nào.

Tôi nghi ngờ điều đó .đã được thay đổi thành \.vì một người dùng phàn nàn sau khi họ tạo bí danh cho ..

Lưu ý rằng \.sẽ gọi một hàm được gọi là .. Có lẽ người dùng viết hàm có nhiều kiến ​​thức hơn người dùng viết bí danh và sẽ biết rằng việc xác định lại một lệnh tiêu chuẩn .profilelà một ý tưởng tồi nếu bạn định đưa mã từ bên thứ ba. Nhưng nếu bạn muốn bỏ qua cả bí danh và hàm, bạn có thể viết command .. Tác giả của đoạn trích này cũng không làm điều này bởi vì họ quan tâm đến những chiếc vỏ cổ không có commandsẵn, hoặc nhiều khả năng là vì họ không biết về nó.

Nhân tiện, việc xác định bất kỳ bí danh nào.profile là một ý tưởng tồi vì .profilelà tập lệnh khởi tạo phiên , không phải là tập lệnh khởi tạo shell . Bí danh cho bash thuộc về .bashrc.


9

Đây \.là một "dấu chấm", nghĩa là chỉ một dấu chấm. Nó sẽ được coi là .lệnh tiêu chuẩn (tương tự như sourcetrong bash).

Tiêu chuẩn POSIX có điều này để nói về điều này (sự nhấn mạnh của tôi)

A <backslash>không được trích dẫn sẽ bảo tồn giá trị theo nghĩa đen của ký tự sau , ngoại trừ a <newline>. Nếu a <newline>theo sau <backslash>, shell sẽ hiểu điều này là tiếp tục dòng. Các <backslash><newline>được loại bỏ trước khi tách đầu vào vào thẻ . Vì thoát <newline>được loại bỏ hoàn toàn khỏi đầu vào và không bị thay thế bởi bất kỳ khoảng trắng nào, nên nó không thể đóng vai trò là dấu tách mã thông báo.

Ký tự dấu chấm có thể được đặt bí danh:

$ alias .='echo hello'
$ .
hello

có nghĩa là \.sẽ tránh sử dụng phiên bản bí danh của .lệnh, bởi vì ,

Sau khi mã thông báo đã được phân định, nhưng trước khi áp dụng các quy tắc ngữ pháp trong Shell Grammar, một từ kết quả được xác định là từ tên lệnh của một lệnh đơn giản sẽ được kiểm tra để xác định xem đó có phải là tên bí danh không hợp lệ hay không.


Tôi đã tìm kiếm nguồn chính thức về cách gạch chéo ngược trong một từ được hiểu là trích dẫn và cách điều này ngăn chặn việc mở rộng bí danh. Cảm ơn đã tham khảo!
Sheljohn

1
@Sheljohn Xem câu trả lời cập nhật.
Kusalananda
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.