Tệp thực thi có tên 'test' nằm trong $ PATH nhưng sẽ không chạy


13

Tôi có một tệp trong $ HOME / bin (trước khi bạn hỏi, vâng, nó nằm trong đường dẫn của tôi) được gọi testmà tôi đã xác nhận có thể được thực thi tốt khi tôi chạy nó với đường dẫn đầy đủ đến tệp. Tuy nhiên, tôi gặp một vấn đề thực sự kỳ lạ khi tôi không chạy nó theo cách này. Khi tôi chỉ chạy testtrong thiết bị đầu cuối, nó không làm gì cả và trả về ngay lập tức. Tôi biết rằng đây không phải là vấn đề tìm tệp vì nhiều lý do:

  1. Không có thông báo lỗi. Thông thường nếu tập tin không thể được tìm thấy hoặc không thể được thực thi, một thông báo sẽ được in ra nói như vậy.

  2. Chạy which testvẫn trả về đường dẫn tệp chính xác.

  3. Có lẽ là kỳ lạ nhất trong tất cả - kịch bản hoạt động tốt khi chạy qua strace. Tôi đã thử sử dụng straceđể xem liệu tôi có thể biết được chuyện gì đang xảy ra không nhưng khi tôi chạy nó strace, nó hoạt động như mong đợi với 0 vấn đề.



Câu trả lời:


45

testlà một cái tên không may sử dụng, nó là tiện ích tiêu chuẩn cho các bài kiểm tra có điều kiện . (Đây thực sự là một lệnh tương tự như [trong if [ ... ], nó trông giống như một thứ cú pháp, nhưng thực sự chỉ là một lệnh bình thường.)

testcũng được tích hợp sẵn trong ví dụ Bash, vì vậy việc chạy testkhông bao giờ tìm kiếm nhị phân của bạn từ đường dẫn.

bash$ help test | head
test: test [expr]
    Evaluate conditional expression.

    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  
    [...]

test không có đối số chỉ trả về 1 (sai).

Chạy strace testkhông liên quan đến shell dựng sẵn, vì stracebản thân nó không thực hiện bất kỳ tiện ích nào. Nó chỉ sử dụng những gì nó tìm thấy trong của bạn PATH. Lưu ý rằng bạn có thể có tiêu chuẩn testtrong /bin/testhoặc /usr/bin/test, vì vậy nếu đó là lần đầu tiên PATH, stracesẽ chạy chạy nó.

Trên Bash của tôi, whichcũng là một lệnh bên ngoài, vì vậy nó cũng không có ý tưởng nào về các nội trang. Mặt khác, các typelệnh là dựng sẵn để vỏ, và type testsẽ thấy test is a shell builtin.

Xem thêm: Tại sao không sử dụng "cái nào"? Dùng gì rồ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.