it-swarm-vi.com

Làm thế nào để Linux xử lý nhiều dấu tách đường dẫn liên tiếp (tập tin / home //// tên người dùng ///)?

Tôi đang làm việc với tập lệnh python chuyển các vị trí tệp sang quy trình con scp. Điều đó không sao, nhưng tôi đang ở trong tình huống tôi có thể kết thúc một đường dẫn với tên tệp sao cho có một đôi '/ trong đường dẫn. Tôi biết rằng bash không quan tâm nếu bạn có nhiều trình phân tách tệp, nhưng tôi tự hỏi làm thế nào chính xác điều đó được khắc phục. Có phải bash mà dải thêm /s hay nó thực sự không quan trọng bao giờ?

Tôi yêu cầu bởi vì nó sẽ tiết kiệm cho tôi một vài dòng mã để kiểm tra thêm /s trong khi nối. Tôi biết đó không phải là một vấn đề lớn, nhưng tôi cũng tò mò. Tôi có một tập lệnh bash có dòng cd //usr (thay vì cd /usr), dường như ngụ ý có thể có một ý nghĩa đối với việc sử dụng nhiều /s trong một con đường

117
Falmarri

Nhiều dấu gạch chéo được phép và tương đương với một dấu gạch chéo. Từ Đặc tả Unix đơn (phiên bản 4) , định nghĩa cơ sở §3.271 tên đường dẫn : Hồi Nhiều dấu gạch chéo liên tiếp được coi là giống như một dấu gạch chéo.

Có một ngoại lệ: Nếu một tên đường dẫn bắt đầu bằng hai ký tự liên tiếp, thành phần đầu tiên theo sau các ký tự đầu có thể được hiểu theo cách xác định theo cách thực hiện. (ref: định nghĩa cơ sở §4.13 độ phân giải tên đường dẫn ). Bản thân Linux không làm điều này, mặc dù một số ứng dụng có thể và các hệ thống unix-ish khác làm (ví dụ: Cygwin).

Một dấu vết / ở cuối tên đường dẫn buộc tên đường dẫn phải tham chiếu đến một thư mục. Trong ( POSIX 1003.1-2001 (Unix v4) định nghĩa cơ sở §4.11 độ phân giải tên đường dẫn , dấu / tương đương với dấu /.. POSIX 1003.1-2008 (Các định nghĩa cơ bản Unix v4) §4.1 loại bỏ yêu cầu để làm cho nó tương đương với /., để đối phó với các thư mục không tồn tại (ví dụ: mkdir foo/ là bắt buộc để làm việc, trong khi mkdir foo/. sẽ không - xem lý do để biết sự thay đổi).

Đối với các chương trình hoạt động trên một mục nhập thư mục, nếu foo là một liên kết tượng trưng đến một thư mục, sau đó chuyển foo/ là một cách để làm cho chương trình hoạt động trên thư mục thay vì liên kết tượng trưng.

¹ Lưu ý rằng điều này chỉ áp dụng cho độ phân giải tên đường dẫn, tức là khi truy cập tệp. Thao tác tên tệp có thể hoạt động khác nhau. Ví dụ basenamedirname bỏ qua dấu gạch chéo.

173

Hệ điều hành dường như cũng không quan tâm đến nó, khi vừa thử một chương trình C với một tòa nhà trực tiếp để mở bằng // trong đường dẫn.

Bạn có thể sử dụng python chức năng thư viện os.path.normpath để bình thường hóa nó, điều này giúp bạn phải quét qua chuỗi tìm kiếm bổ sung. Các ngôn ngữ khác có chức năng tương tự.

http://docs.python.org/l Library/os.path.html # os.path.normpath

17
Ivatar

Trên tất cả các hệ thống Unix mà tôi đã thấy nó giống như một /, nhưng tiêu chuẩn Unix chỉ định rằng

Một tên đường dẫn bắt đầu bằng hai dấu gạch chéo liên tiếp có thể được hiểu theo cách xác định theo cách thực hiện, mặc dù nhiều hơn hai dấu gạch chéo hàng đầu sẽ được coi là một dấu gạch chéo.

vì vậy nó có thể được xử lý đặc biệt, tùy thuộc vào hệ thống của bạn. (Một số phiên bản Unix cũ hơn đã sử dụng hai đầu / để truy cập hệ thống tập tin từ xa và vẫn có thể có một số hoạt động.)

9
Fred Foo

Sử dụng os.path.join in Python và bạn sẽ không nhận được nhiều dấu gạch chéo. Tự xây dựng tên tệp bằng cách nối chuỗi được coi là kém Python.

7
Neil Mayhew

Không có sự khác biệt.

Nhiều dấu gạch chéo bị bỏ qua (không có hiệu lực), ví dụ:

ls -al //usr///////bin/sed
3
ChristopheD

Tất nhiên, bạn có thể bình thường hóa một đường dẫn có nhiều/(dấu gạch chéo) có thể trong đó bằng cách chuyển nó qua tr -s

NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)

... và sau đó sử dụng $NORMALIZED

Tuy nhiên, nó là cần thiết. Như tôi biết, bất kỳ hạt nhân UNIX đúng nào cũng nên bỏ qua các dấu tách đường dẫn đồng thời --- hoặc về mặt khái niệm coi chúng là ..././...

0
Jim Dennis