Tại sao ./ là cần thiết để chạy một tập tin runnable?


9

Tôi đang sử dụng Ubuntu và tôi nhận thấy nhiều tập lệnh có thể chạy của tôi sẽ không chạy trừ khi tôi đi trước chủ đề ./.

Ví dụ: nếu tôi có tập lệnh perl: /home/me/script.plvà tôi hiện đang tham gia /home/me, gõ script.plsẽ không làm điều đó, nhưng ./script.plsẽ.

Tại sao vậy?


@David B runnable file => executable file:?
Lazer

Câu trả lời:


13

Để thực thi tập lệnh, bạn cần nhập đường dẫn đầy đủ vào tập lệnh trừ khi tập lệnh có mặt trong một trong các thư mục được liệt kê trong $PATHbiến môi trường của bạn . Nói chung (và theo mặc định) .(thư mục hiện tại) không có trong bạn $PATH, vì vậy bạn cần nhập ./scriptđể thực thi nó.


21

Bởi vì thư mục hiện tại không nằm trong đường dẫn của bạn. Đây là một tính năng an toàn. Nếu nó nằm trong đường dẫn của bạn, ai đó có khả năng bỏ một bản sao độc hại của một lệnh chung và khi bạn ở trong thư mục đó thay vì chạy sudo thật, chẳng hạn, bạn sẽ chạy lệnh giả. Đó là một điều xấu.


3
Điều này có phần sai lệch. Chừng nào .sau /usr/bin/đó, nó sẽ không thay thế thực tế sudo. Đó là để đảm bảo bạn không vô tình thêm các chương trình vào đường dẫn của mình, nhưng chủ yếu không phải là thay thế các chương trình hiện có.
Matthew Flaschen

Thay vì sudo, tôi sẽ sử dụng lsrm. Nhiều khả năng được gọi là.
Aaron Digulla

@aaron: chắc chắn nhưng lssẽ không hỏi mật khẩu của bạn và nếu người dùng có thể sử dụng sudomật khẩu thì thật thú vị ...;)
laurent

1
@Matthew. Vâng, nó vẫn là một khó khăn để khai thác nhưng rủi ro bảo mật thực sự. Hãy nói rằng tôi đưa vào một kịch bản sllàm những điều xấu, sau đó gọi ls, sau đó xóa chính nó. Bạn không thể ghi đè các công cụ hệ thống, nhưng bạn có thể 'typosquat'
Rich Homolka

@laurent: Điều tôi có trong đầu là : cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Không cần biết mật khẩu.
Aaron Digulla

4
echo $PATH

Bạn phải có thư mục hiện tại (một dấu chấm đơn) trong đường dẫn của bạn để làm việc này.

Bạn có thể thêm nó vào đường dẫn của bạn nếu bạn muốn với các lệnh sau.

sh / bash: export PATH=$PATH:.

tcsh / csh: set PATH = ($PATH .)


3

Shell tìm kiếm đường dẫn để thực thi và theo mặc định ./không có trong đường dẫn.

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.