Có sự khác biệt nào giữa các đường dẫn tập tin và các tập tin khác nhau không?


12

Như tiêu đề nói, có sự khác biệt nào đối với các hệ thống tập tin * NIX không? ví dụ ls filels ./file


1
Bạn có thể hỏi unix.stackexchange.com - câu trả lời cho đến nay tất cả đều có thông tin tốt trong họ, nhưng không thực sự cảm thấy như các câu trả lời.
Rob Starling

Câu trả lời:


14

Tôi không điên về lời giải thích của SmallLoanOf1M. Nó đúng về mặt kỹ thuật nhưng trả lời theo cách không khớp với ví dụ sử dụng trong câu hỏi.

Vì vậy, bằng ví dụ, đây là một sự khác biệt quan trọng giữa hai từ câu hỏi: "file" và "./file"

Điều gì nếu tập tin được đặt tên với một ký tự được phân tích cú pháp bởi trình bao? Đặc biệt là liên quan đến các ký tự được giải thích bởi lệnh một đang chạy.

Cụ thể, ký tự "gạch ngang": "-". Nhưng các nhân vật khác có ý nghĩa với vỏ.

Thí dụ. Tập tin của tôi được đặt tên là "-dingle"

Hãy thử liệt kê các tập tin:

ls -dingle
# ls -dingle
ls: invalid option -- 'e'

Thậm chí tệ hơn, nếu tập tin được đặt tên là " -rf rmbomb *" thì sao? Bây giờ hãy thử loại bỏ nó

rm "-rf rmbomb *"

Tôi thậm chí sẽ không chạy ví dụ đó, nhưng hy vọng bạn có ý tưởng.

Vì vậy, làm thế nào để bạn liệt kê một tập tin nhìn chằm chằm với dấu gạch ngang? Sử dụng ./ở phía trước.

# ls ./-dingle
./-dingle

Ditto cho rm


Đó là một cách hợp lệ để xử lý một số tệp có tên kỳ lạ và câu trả lời của tôi không xem xét các tệp như vậy. Người ta cũng có thể sử dụng một nghĩa đen thay vì trong tất cả các ví dụ ở trên, dưới dạng dấu gạch chéo ngược trước các ký tự lẻ, bao gồm các khoảng trắng được chỉ định ở trên. Một ví dụ về điều đó sẽ là như vậy: ls \-dinglehoặc ls \-rf\ rmbomb\ \*. Đây có thể là một cách tốt để đảm bảo rằng bất kỳ nhóm lệnh đã cho nào ít nhất là nhất quán, như chỉ định ./trước một tên sẽ không thoát khỏi các ký tự sau ./.
Spooler

2
Nó xảy ra rằng, vì thoát được thoát bởi shell, không phải lệnh và params được phân tích cú pháp bởi lệnh, thoát hoặc trích dẫn - không có gì hữu ích.
Dewi Morgan

2
Bạn làm cho nó có vẻ như rm "-rf rmbomb *"thực sự sẽ làm điều gì đó xấu, thay vì chỉ rmin lỗi. Nó chỉ nguy hiểm nếu bạn quên trích dẫn tên tệp, vì vậy việc chia tách từ xảy ra. (đặc biệt trong tập lệnh shell nơi bạn chạy rm $filethay vì rm "$file". Nhưng trong trường hợp đó, phần *mở rộng sẽ không mở rộng, vì việc mở rộng toàn cầu không xảy ra đối với nội dung của mở rộng biến. Nếu bạn muốn điều đó, bạn cần một eval.) Dù sao, nếu tập lệnh của bạn tách tên tập tin trước khi chuyển sang rm, tôi sẽ tạo một tệp được gọi space -rf .hoặc một cái gì đó, vì vậy rm ./$ikhông có ích.
Peter Cordes

1
BTW, thông báo lỗi thực tế là rm: invalid option -- ' ', từ khi nó cố gắng diễn giải khoảng trắng sau khi -rfchuyển đổi một ký tự, bởi vì đó là một phần của cùng một đối số. (Và vâng, tôi đã chạy cái này trong một thư mục trống trong trường hợp tôi đã bỏ qua thứ gì đó và nó thực sự nguy hiểm: P)
Peter Cordes

2
@PeterCordes: từ ghép và toàn cầu DOES xảy ra trên kết quả của việc mở rộng biến không được trích dẫn và thay thế lệnh, trừ khi bị loại bỏ bởi IFS=''-ftương ứng. Một ví dụ hiếm hơn là awkxử lý một toán hạng (khác với toán hạng đầu tiên là tập lệnh) có dạng foo=barnhư một bài tập để thực thi nhưng ./foo=bardưới dạng tệp để đọc.
dave_thndry_085

7

Đúng.

Bằng cách phát hành filetrên dòng lệnh, BASH sẽ tìm kiếm biến môi trường $ PATH của bạn để tìm tệp có tên đó. Trừ khi tệp nằm trong một thư mục trong biến $ PATH của bạn, nó sẽ không được tìm thấy.

.có nghĩa là thư mục hiện tại. ./có nghĩa là trong thư mục hiện tại, trong điều khoản tương đối. Nó tương đương với việc nói một cái gì đó như /home/sheogorath/shivering/isles.imgkhi gọi ./isles.imgtrong khi làm việc trong /home/sheogorath/shivering/thư mục.

Như vậy, nó thường được sử dụng để thực thi các tệp trong thư mục làm việc của bạn "tại chỗ".

EDIT: Trong ví dụ của bạn, lsđược gọi bởi shell và được tìm thấy bằng cách sử dụng biến đường dẫn. Đối số của nó sẽ được xử lý trong thư mục làm việc của bạn, bất cứ điều gì có thể. Vì đây là mặc định cho ls, bạn sẽ không thấy bất kỳ sự khác biệt nào giữa việc chỉ định filevà chỉ định rõ ràng ./filekhi cả hai đều trỏ đến thư mục hiện tại của bạn.

Không phải tất cả các lệnh sẽ chấp nhận đường dẫn tệp trong thư mục làm việc và một số lệnh sẽ đưa bạn trạng thái tệp trong thư mục mà chính chúng xác định trước thông qua cấu hình. Trong số các lệnh chấp nhận tệp làm đối số, các lệnh này ít phổ biến hơn


1
Đó là bash, nhưng tôi đã tự hỏi về độ phân giải đường dẫn nói chung
Sergey Alaev

1
Đây là cách mà bất kỳ vỏ nào tôi từng nghe về các tác phẩm. BASH chỉ đơn thuần là sử dụng phổ biến nhất.
Spooler

4
$ PATH chỉ liên quan đến các lệnh và không có gì với các đối số tên tệp tuân theo một lệnh như lsđược đề cập trong câu hỏi ban đầu. Đó là sự khác biệt nhiều hơn giữa việc giới thiệu lại một đường dẫn tương đối (so với thư mục làm việc hiện tại) Tức ../../dir/filenamelà một đường dẫn tuyệt đối /path/to/dir/filename
HBruijn

1
+1 cho Sheogorath ... và một câu trả lời đúng.
Corey Ogburn

1
Nếu chúng là đối số của một lệnh cố gắng tìm các tệp trong thư mục làm việc theo mặc định, chúng sẽ giống nhau. Do đó, đối với lschúng sẽ luôn là cùng một đường dẫn, một đường dẫn được chỉ định rõ ràng hơn đường dẫn khác. Không phải tất cả các lệnh hành xử theo cách này khi xử lý các đối số, nhưng hầu hết đều làm.
đệm
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.