Câu trả lời:
Trong Linux, UNIX và các hệ điều hành liên quan, .
biểu thị thư mục hiện tại. Vì bạn muốn chạy một tệp trong thư mục hiện tại của bạn và thư mục đó không nằm trong tệp của bạn $PATH
, bạn cần ./
bit để báo cho trình bao biết nơi thực thi. Vì vậy, ./foo
có nghĩa là chạy thực thi được gọi foo
là trong thư mục này.
Bạn có thể sử dụng type
hoặc which
để có được đường dẫn đầy đủ của bất kỳ lệnh nào được tìm thấy trong $PATH
.
alias
es có thể cản trở, không chỉ $PATH
.
.
trước thì đó sẽ là một vấn đề bảo mật, bạn hoặc người khác có thể thay thế ls
(ví dụ: một virus / trojen đơn giản: tạo một tệp zip có thể thực thi được đặt tên ls
trong đó, khi ai đó đang tìm kiếm , họ chạy chương trình thực thi này, điều đó). Nếu .
cuối cùng nó tìm kiếm thì bạn có thể mất nhiều thời gian phát điên vì không biết tại sao chương trình của bạn không hoạt động (ví dụ: bạn tạo một chương trình gọi là kiểm tra, thay vì chạy chương trình của bạn, nó chạy chương trình kiểm tra hệ thống. Không tạo ra đầu ra).
export PATH="$PATH:."
để thực thi lệnh trong thư mục hiện tại nếu không tìm thấy ở nơi nào khác trong PATH, bạn có thể thêm lệnh này vào tệp .bashrc của mình
Câu trả lời theo nghĩa đen là như những người khác đã đưa ra: bởi vì thư mục hiện tại không có trong của bạn $PATH
.
Nhưng tại sao? Nói tóm lại, đó là vì an ninh. Nếu bạn đang tìm trong thư mục chính của người khác (hoặc / tmp) và nhập chỉ gcc
hoặc ls
, bạn muốn biết bạn đang chạy phiên bản thật chứ không phải phiên bản độc hại mà người bạn chơi khăm của bạn đã viết sẽ xóa tất cả các tệp của bạn. Một ví dụ khác sẽ là test
hoặc [
, có thể ghi đè các lệnh đó trong tập lệnh shell, nếu shell của bạn không có các lệnh như được xây dựng.
Có .
khi cuối cùng mục trong đường dẫn của bạn là một chút an toàn hơn, nhưng có một cuộc tấn công khác mà làm cho sử dụng đó. Một cách dễ dàng là khai thác các lỗi chính tả phổ biến, như sl
hoặc ls-l
. Hoặc, tìm một lệnh chung không được cài đặt trên hệ thống này - vim
ví dụ: vì các sysadins có khả năng cao hơn mức trung bình để gõ nó.
PATH
biến môi trường.
Nếu bạn muốn nói, tại sao bạn cần ./ khi bắt đầu - đó là bởi vì (không giống như trong Windows), thư mục hiện tại không phải là một phần của đường dẫn của bạn theo mặc định. Nếu bạn chạy:
$ ls
shell của bạn tìm kiếm ls
trong các thư mục trong biến môi trường PATH của bạn ( echo $PATH
để xem nó) và chạy tệp thực thi đầu tiên được gọi là ls
nó tìm thấy. Nếu bạn gõ:
$ a.out
Shell sẽ làm tương tự - nhưng có lẽ nó sẽ không tìm thấy một thực thi được gọi là a.out. Bạn cần nói với shell nơi a.out là - nó nằm trong thư mục hiện tại (.) Thì đường dẫn là ./a.out
.
Nếu bạn hỏi tại sao nó được gọi là "a.out", thì đó chỉ là tên tệp đầu ra mặc định cho gcc. Bạn có thể thay đổi nó bằng dòng lệnh -o arg. Ví dụ:
$ gcc test.c -o test
$ ./test
touch .a.out; ls -lA
xem điều này.)
<dir>/<file>
vì vậy về cơ bản bạn đang nói thực thi một tệp trong thư mục hiện tại, được chỉ định bởi./test
Bạn có thể thử thêm :.
vào biến $ PATH của mình.
Hãy thử ALT + F2 và gõ: gksudo gedit /etc/environment
nếu chạy Linux / GTK (đây là những gì bạn có nếu sử dụng Ubuntu).
TUY NHIÊN, tôi thực sự khuyên bạn KHÔNG nên làm điều đó. Thật tệ, xấu và xấu.
Bạn biết đấy, những thứ đó hoạt động như thế này từ năm 1970. Có một lý do tại sao thư mục hiện tại không được bao gồm trong $ PATH.
.
là thư mục hiện tại
.something
sẽ là một tệp ẩn (Nhập "ALT +" để làm cho chúng xuất hiện trong Nautilus hoặc thử " ls -la
".
./someProgram.sh
là những gì bạn gõ để CHẠY một sốProPro.sh thực thi trong thư mục hiện tại.
.somethingElse
sẽ có nghĩa là bạn có một thực thi ẩn trong thư mục hiện tại, đó là một ý tưởng tồi.
./command_name
để thực thi một lệnh trong linux?"