Tại sao chúng ta sử dụng tập tin.


84

Tại sao chúng ta sử dụng ./filenameđể thực thi một tập tin trong linux?

Tại sao không nhập nó như các lệnh khác gcc, lsv.v ...


Không phải dòng đầu tiên sẽ được viết tốt hơn là "Tại sao chúng ta sử dụng ./command_nameđể thực thi một lệnh trong linux?"

Câu trả lời:


78

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, ./foocó nghĩa là chạy thực thi được gọi foolà trong thư mục này.

Bạn có thể sử dụng typehoặc whichđể có được đường dẫn đầy đủ của bất kỳ lệnh nào được tìm thấy trong $PATH.


5
Nó là rất phổ biến để thực hiện các chương trình trong thư mục hiện tại. Tại sao không tìm kiếm vỏ trong đó là tốt? Đầu tiên, nó tìm kiếm trong., Sau đó là $ PATH.
Michael

cũng có những aliases có thể cản trở, không chỉ $PATH.
user2485710

18
@Michael bảo mật và sự tỉnh táo: Nếu nó được tìm kiếm .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 lstrong đó, 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).
ctrl-alt-delor

Nó cũng đảm bảo rằng nếu ứng dụng hoặc tập lệnh xuất hiện nhiều lần trong đường dẫn của bạn, thì bạn đang thực thi phiên bản mà bạn định chạy (phiên bản ngay trong thư mục "." Của bạn).
Jim2B

Bạn có thể thực thi 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
jcubic

99

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ỉ gcchoặ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à testhoặ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.

.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ư slhoặ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 - vimví dụ: vì các sysadins có khả năng cao hơn mức trung bình để gõ nó.


5
Một ví dụ thực tế về việc ai đó nhận được bit bằng cách này: unix.stackexchange.com/questions/7767
mattdm

Chỉ cần có đường dẫn tuyệt đối trong PATHbiến môi trường.
Ed Heal

45

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 lstrong 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à lsnó 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

Cảm ơn. Tôi nghi ngờ là tại sao bạn cần ./ khi bắt đầu .... Tôi đã sử dụng "." (để đọc thư mục hiện tại) nhưng tại sao "/" sau đó?
Renjith G

8
/ là dấu phân cách đường dẫn trong Linux, vì vậy bạn sử dụng nó để tách thư mục (.) khỏi tên tệp (a.out). Không có nó, bạn có .a.out là tên tệp hợp lệ theo đúng nghĩa của nó. (Hãy thử touch .a.out; ls -lAxem điều này.)
Simon Whitaker

5
đó là cách bạn chỉ định đường dẫn trong Unix, <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
Rohan Monga

Red Hat Linux phát hành 9 (Shrike) Kernel 2.4.20-8 trên i686 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA tổng 3 -rw-rw-r-- 1 renjithg renjithg 0 ngày 30 tháng 11 : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11.669 ngày 30 tháng 11 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 ngày 24 tháng tám năm 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G

3
Mũ đỏ Linux 9? Thời gian để nâng cấp!
mattdm

4

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/environmentnế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

.somethingsẽ 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.

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.