File yang dapat dieksekusi bernama 'test' dalam $ PATH tetapi tidak akan berjalan

13

Saya memiliki file dalam $ HOME / bin (sebelum Anda bertanya, ya, itu ada di jalur saya) yang disebut testsudah saya konfirmasi dapat dieksekusi dengan baik ketika saya menjalankannya dengan path lengkap ke file tersebut. Namun, saya mendapatkan masalah yang sangat aneh ketika saya tidak menjalankannya dengan cara ini. Ketika saya hanya menjalankan testdi terminal, tidak melakukan apa-apa dan kembali segera. Saya tahu ini bukan masalah menemukan file karena beberapa alasan:

  1. Tidak ada pesan kesalahan. Biasanya jika file tidak dapat ditemukan atau tidak dapat dieksekusi pesan akan dicetak mengatakan demikian.

  2. Menjalankan which testmasih mengembalikan jalur file yang benar.

  3. Mungkin yang paling aneh dari semuanya - skrip berfungsi dengan baik saat dijalankan strace. Saya mencoba menggunakan straceuntuk melihat apakah saya bisa mengetahui apa yang sedang terjadi tetapi ketika saya menjalankannya strace, itu berfungsi seperti yang diharapkan dengan 0 masalah.

ContronThePanda
sumber

Jawaban:

45

testadalah nama yang disayangkan untuk digunakan, ini adalah utilitas standar untuk pengujian bersyarat . (Ini sebenarnya perintah yang sama dengan [di if [ ... ], itu hanya terlihat seperti hal sintaksis, tetapi benar-benar hanya perintah normal.)

testjuga bawaan di misalnya Bash, jadi menjalankan hanya testtidak pernah mencari biner Anda dari path.

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 tanpa argumen hanya mengembalikan 1 (false).

Menjalankan strace testtidak melibatkan shell builtin, karena stracetidak mengimplementasikan utilitas itu sendiri. Itu hanya menggunakan apa yang ditemukan di blog Anda PATH. Perhatikan bahwa Anda mungkin memiliki standar testdi /bin/testatau /usr/bin/test, jadi jika itu akan menjadi yang pertama PATH, stracejalankan jalankan itu.

Di Bash saya, whichjuga merupakan perintah eksternal, sehingga tidak memiliki ide tentang builtin. Di sisi lain, para typeperintah adalah builtin ke shell, dan type testakan menunjukkan bahwa test is a shell builtin.

Lihat juga: Mengapa tidak menggunakan "yang"? Lalu apa yang harus digunakan?

ilkkachu
sumber