Tại sao tôi phải gõ vào. / Luôn luôn trước khi thực thi để thực thi nó trong Linux?


8

Khi tôi biên dịch egxc bằng cách:

GCC x.c -o x

Để thực hiện kết quả tôi phải viết:

./x

Và chỉ cần gõ:

x

Thất bại với thông báo này:

x: lệnh không tìm thấy

Điều này có nghĩa là Linux không tìm kiếm thư mục hiện tại cho nó! Có (tôi chắc chắn có) bất kỳ vấn đề hợp lý đằng sau hành vi này?


Bởi vì đó là quy tắc.
Daniel R Hicks

@DanH: Sau đó giải thích "các quy tắc".
Torben Gundtofte-Bruun

Câu trả lời:


13

Bởi vì theo mặc định, thư mục làm việc hiện tại không nằm trong PATHbiến.

Đây là một biện pháp an ninh / thuận tiện. Nếu bạn có mã nhị phân / script gọi là ví dụ cd, lsvv trong thư mục làm việc hiện tại của bạn, nó sẽ rất khó chịu nếu họ đã chạy theo mặc định.


4
Câu trả lời chỉ đúng một phần. Vấn đề có thể được bao quanh nếu thư mục hiện tại chỉ được sử dụng làm tùy chọn cuối cùng. Sau đó, các công cụ tiêu chuẩn vẫn sẽ được tìm thấy đầu tiên.
người dùng không xác định

1
Ngoài ra, các nội dung shell được ưu tiên (nghĩa là khi bạn nhập cdvào bash, nó sẽ thực thi một hàm nội bộ thông thường để bash và không /bin/cd) trừ khi bạn đăng ký với `.`
LawrenceC

3
Một trong những biện pháp bảo mật * nix ban đầu, nó buộc các nhị phân được biên dịch bởi hệ thống hoặc quản trị viên trong lệnh đường dẫn được gán của hệ thống được thực thi. Không có gì tệ khi ai đó đăng nhập bằng root trong câu hỏi của bộ phận trợ giúp, truy cập thư mục người dùng, nhập ls và thấy họ đã tải một quả bom do người dùng để lại.
Phòng thí nghiệm Fiasco

7
@userunknown: Và lần đầu tiên bạn đánh máy sl, bạn cũng gặp vấn đề tương tự. Chỉ danh bạ tin cậy phải ở trong $PATHvà đường dẫn tương đối thích .không bao giờ một thư mục đáng tin cậy cho một vỏ tương tác.

2
@Basic: Nếu tôi gõ rm -r targetkhi tôi muốn nói rm -f targetthì thường không có sự khác biệt. Nếu tôi gõ rm -f targetkhi tôi muốn rm -r target, thì không có sự khác biệt hoặc loại bỏ hoàn toàn thất bại. Hơn nữa, tôi nghĩ mỗi lần trước khi tôi gõ rm, đặc biệt là nếu tôi thêm -fhoặc toàn -rcầu - đó là một lệnh nguy hiểm theo bản chất của nó. Không ai nghĩ trước khi lsing.

1

Điều đó có nghĩa là thư mục hiện tại không nằm trong biến $ PATH.


1

Bạn có thể khắc phục điều này bằng cách thêm thư mục hiện tại (được biểu thị bằng một dấu chấm đơn) vào PATHbiến môi trường.
Cách để làm điều đó phụ thuộc vào vỏ bạn đang sử dụng.
nếu bạn đang sử dụng bash, bạn có thể thêm dòng export PATH=$PATH:.vào .bashrctệp trong thư mục chính của bạn.
nếu bạn đang sử dụng csh hoặc tcsh, hãy thêm dòng set PATH = ($PATH .)vào tệp .cshrc trong thư mục chính của bạn.
IMHO, đối với một máy tính để bàn gia đình, đây là một điều có thể chấp nhận được - bảo mật khôn ngoan.


Tôi không biết chúng ta có thể thêm. để PATH, tuy nhiên, làm điều này sẽ làm giảm tính bảo mật, phải không?
Yasser Zamani
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.