Tôi có nên sử dụng dấu gạch chéo ở cuối biến đường dẫn trong tập lệnh shell hay không? [đóng cửa]


11

Hôm nay khi viết kịch bản shell của tôi.

Một câu hỏi đột nhiên xuất hiện trong đầu tôi.

cd /target_dircd /target_dir/cả hai công trình.
Tôi có nên thêm dấu gạch chéo ở cuối biến đường dẫn trong tập lệnh shell không?
Chẳng hạn như LOG_PATH=/data/nginx/logsso với LOG_PATH=/data/nginx/logs/.

Tôi đã thực hiện một số tìm kiếm tổng thể trên google, nhưng không tìm thấy thảo luận về điều này, có lẽ nó quá cơ bản?

Hiện tại, thật khó để tôi quyết định chọn kiểu nào.
Nhưng tôi thích LOG_PATH=/target_dir/phong cách hơn một chút.
Bởi vì khi tôi thực hiện tự động hoàn thành với bash, nó sẽ cho tôi kết quả bằng dấu gạch chéo.

Ý kiến ​​của bạn về điều này là gì, tại sao?



Không có quy tắc. Cả hai phong cách mã hóa đều có một số ưu điểm và một số nhược điểm.
andcoz

Câu trả lời:


8

Theo POSIX:

Định nghĩa tên đường dẫn:

Một chuỗi được sử dụng để xác định một tập tin. Nó có các ký tự <slash> bắt đầu tùy chọn , theo sau là 0 hoặc nhiều tên tệp được phân tách bằng các ký tự <slash> . Tên đường dẫn có thể tùy ý chứa một hoặc nhiều ký tự <slash> . Nhiều ký tự <slash> liên tiếp được coi là giống như một <slash> , ngoại trừ trường hợp có chính xác hai ký tự <slash> hàng đầu .


@ Thật thú vị, tôi có thể cd đến ///với tên của họ hiển thị khác nhau trên dấu nhắc bash và sử dụng pwdtôi sẽ hiển thị đường dẫn khác nhau, nhưng nội dung của chúng giống hệt nhau! Tại sao?
Zen


1
Bởi vì bashtheo dõi thư mục hiện tại một cách rất ngây thơ, như một chuỗi. Nó chỉ nối và xóa khỏi đường dẫn heuristur, nó không liên kết với hệ thống tập tin thực tế. Một hậu quả là bạn có thể cd vào một liên kết tượng trưng và quay lại theo cùng một cách (nếu bash không quyết định nó là quá nhiều và tái cấp phép lại nó). Khác là những gì bạn mô tả. Bạn không nên dựa vào theo dõi của shell của thư mục hiện tại, nó không đáng tin cậy.
orion


6

Để được an toàn, bao gồm dấu gạch chéo. Điều này có thể dẫn đến nhiều dấu gạch chéo khi nối các đường dẫn, nhưng ít nhất bạn tránh được các vấn đề.

Một vài ví dụ: rsyncđối xử với những con đường khác nhau nếu đường gạch chéo được bao gồm (nó đồng bộ thư mục thay vì làm thư mục con khác). Các liên kết tượng trưng đến các thư mục đôi khi hoạt động theo cách không mong muốn khi chúng không có dấu gạch chéo - ít nhất là hoàn thành shell bị nhầm lẫn. Bạn không bao giờ biết nếu lệnh / tập lệnh bạn gọi phụ thuộc vào việc kiểm tra dấu gạch chéo cho một số hành vi đặc biệt. Nó thậm chí có thể cứu bạn khỏi ghi đè lên một cái gì đó. Chẳng hạn, nếu bạn có một tệp có tên foo, nhưng bạn nhầm tưởng đó là một thư mục và muốn di chuyển một cái gì đó trong đó, thì mv bar foosẽ ghi đè lên tệp (mất dữ liệu, thảm họa tiềm tàng) nhưng mv bar foo/sẽ chỉ phàn nàn và không làm gì cả.

Vì vậy, để kết luận, hầu hết các trường hợp đều không thành vấn đề, nhưng bạn nên sử dụng dấu gạch chéo để bảo vệ chính mình và cũng để làm cho người đọc hiểu rõ hơn về những gì bạn dự định làm trong một kịch bản. Một người quan sát thông thường sẽ ngay lập tức chắc chắn rằng một biến tham chiếu đến một thư mục nếu nó kết thúc bằng dấu gạch chéo và sẽ sử dụng nó một cách chính xác nếu nó cần được sửa đổi.


2

Không, bạn không nên. Nó thêm một dấu gạch chéo không cần thiết ( /).

thí dụ

nói rằng bạn muốn xuất thư mục java binsang PATHbiến của bạn ,

export PATH=$PATH:/opt/jre1.7.0_45/bin/

bây giờ hãy kiểm tra nó

user@host:~$ which java
/opt/jre1.7.0_45/bin//java

chú ý thêm dấu gạch chéo ( /) trước java, nhưng may mắn là nó chỉ hoạt động trong trường hợp như vậy.


Tôi thấy trong liên kết này có một câu trả lời 31 phiếu trong đó tác giả nghĩ rằng chúng ta nên thêm một dấu gạch chéo. Tôi bối rối. stackoverflow.com/questions/980255/ trộm
Zen

@Zen, vâng tôi đã kiểm tra nó, Đó là trên bình luận đầu tiên của câu hỏi của bạn. Cảm ơn.
Arnab

6
Tốt hơn hai dấu gạch chéo hơn không có. Cái này xấu nhưng an toàn ... tùy chọn khác tệ hơn và có thể nguy hiểm.
orion
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.