Có phải là một thực hành tốt để yêu cầu một dấu gạch chéo phía trước trong tên thư mục?


9

Tôi muốn yêu cầu người dùng tập lệnh bash của tôi chuyển một đường dẫn thư mục làm đối số. Mà một trong những điều sau đây là một thực hành lập trình tốt?

  • Yêu cầu người dùng nhập dấu / / dấu gạch chéo)
  • Yêu cầu người dùng không nhập dấu / / dấu gạch chéo)

3
Lưu ý rằng rsynchành xử khác nhau theo một cách rất quan trọng tùy thuộc vào sự hiện diện của dấu vết /, và vì vậy trong một số trường hợp, bạn muốn bình thường hóa để thống nhất và trong những trường hợp khác, bạn muốn thông qua sạch sẽ để thực hiện những gì người dùng nói (nếu họ nói biết họ đang nói chuyện với rsync).
sh1

Một điều khác làm tôi ngạc nhiên gần đây là ls -l dirhành vi khác với ls -l dir/nếu dirlà một liên kết tượng trưng đến một thư mục.
Flimm

Câu trả lời:


27

Thực hành tốt nhất là giả định không.

Nếu bạn có quyền truy cập vào các tiện ích / lớp của trình xây dựng đường dẫn, hãy sử dụng các tiện ích đó, nếu không viết mã của bạn để chấp nhận định dạng và hành động tương ứng.

Không có gì khó chịu hơn cho người dùng hơn là phải nhớ có nên thêm dấu gạch chéo hay không.


6
Hệ luỵ: Luôn đường dẫn phân tích với những công cụ dòng lệnh phù hợp - dirname, basenamereadlink. Một vấn đề rất phổ biến là sử dụng ${path##*/}thay thế cho basename, nhưng nếu đường dẫn kết thúc bằng dấu gạch chéo trả về một chuỗi rỗng thay vì phần tử đường dẫn cuối cùng.
l0b0

1
+1 để sử dụng các lớp tiện ích. Tôi không thể nói đã bao nhiêu lần tôi thấy các nhà phát triển phát minh lại bánh xe khi nói đến việc lắp ráp các đường dẫn, khi hầu hết các khung có thể làm điều đó một cách dễ dàng hiện nay.
RationalGeek

1
Ngoài ra, tôi rất khó chịu khi một số ứng dụng yêu cầu tôi làm điều này theo một cách cụ thể. Và đôi khi người dùng không thể kiểm soát cách viết đường dẫn đó: Đôi khi họ viết nó, vì vậy, vâng, họ chọn viết có hoặc không có dấu gạch chéo, nhưng trong trường hợp người dùng tự động hoàn thành bằng TAB, nhiều trình bao đặt dấu gạch chéo, Vì vậy, bạn sẽ yêu cầu người dùng xóa nó? Và thậm chí còn khó chịu hơn khi một ứng dụng hoạt động khác đi nếu bạn đặt dấu gạch chéo trong một thư mục được truyền dưới dạng đối số ( rsynctôi đang nhìn bạn)
Carlos Campderrós

Gần đây tôi cần xác minh một dấu gạch chéo từ đầu vào của người dùng để sử dụng với rsync (vì nó nhạy cảm với những điều này). Như @ChrisF đã lưu ý, cách tốt nhất là không nên sử dụng. Tôi đã đưa ra những điều sau đây như một cách giả định duyên dáng: ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))Tôi cũng đã ghi lại nó trong một ý chính cho rõ ràng: thêm hoặc xóa dấu gạch chéo trong bash
John Mark Mitchell

10

Vì bash bỏ qua nhiều dấu gạch chéo, bạn có thể giả định rằng người dùng không nhập dấu gạch chéo trong đường dẫn và tự thêm dấu gạch chéo.

cat /etc/hosts

giống như

cat /////etc//////////hosts

Vì vậy, kịch bản của bạn có thể trông như thế:

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

và bạn không phải lo lắng liệu người dùng có đi vào dấu vết / trong đường dẫn hay không.


5
Nit: Đó không phải là bashhành vi, hạt nhân làm điều đó.
Blrfl

7

Jon Postel quá cố đã có một số lời khuyên tuyệt vời trong phần 3.2 của RFC 760 áp dụng ở đây:

Nói chung, việc thực hiện nên thận trọng trong hành vi gửi của nó và tự do trong hành vi nhận của nó. Đó là, nên cẩn thận gửi các datagram được định dạng tốt, nhưng nên chấp nhận bất kỳ datagram nào mà nó có thể diễn giải (ví dụ: không phản đối các lỗi kỹ thuật trong đó ý nghĩa vẫn rõ ràng).


3

Về mặt khái niệm, dấu gạch chéo không phải là một phần của tên. Dấu gạch chéo chỉ là một dấu phân cách giữa các tên. Home-dir của tôi là / home / stefan và không / home / stefan /.

Nếu bạn không mong đợi một dấu gạch chéo, bạn sẽ không thất bại nếu có, như ammoQ đã lưu ý. Nhưng bạn có thể dễ dàng dán các tên và vars lại với nhau, vì bạn không phải trích dẫn dấu gạch chéo:

a="/home"
b="stefan"

dir=$a/$b

0

Yêu cầu thư mục không được có dấu gạch chéo sẽ cực kỳ khó chịu khi sử dụng tương tác trên bảng điều khiển: tự động hoàn thành với TAB tự động thêm dấu gạch chéo cho thư mục.

Vì vậy, bạn chắc chắn cần phải cho phép các thư mục được chỉ định bằng dấu gạch chéo.

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.