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 file
vàls ./file
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 file
vàls ./file
Câu trả lời:
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
ls \-dingle
hoặ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 ./
.
rm "-rf rmbomb *"
thực sự sẽ làm điều gì đó xấu, thay vì chỉ rm
in 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 $file
thay 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 ./$i
không có ích.
rm: invalid option -- ' '
, từ khi nó cố gắng diễn giải khoảng trắng sau khi -rf
chuyể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)
IFS=''
và -f
tương ứng. Một ví dụ hiếm hơn là awk
xử 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=bar
như một bài tập để thực thi nhưng ./foo=bar
dưới dạng tệp để đọc.
Đúng.
Bằng cách phát hành file
trê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.img
khi gọi ./isles.img
trong 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 file
và chỉ định rõ ràng ./file
khi 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
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/filename
là một đường dẫn tuyệt đối /path/to/dir/filename
ls
chú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.