Saya punya masalah shell yang tampak aneh, dengan perintah di $ PATH bahwa shell (ksh, berjalan di Linux) tampaknya pengecut menolak untuk memohon. Tanpa sepenuhnya memenuhi syarat perintah, saya mendapatkan:
# mycommand
/bin/ksh: mycommand: not found [No such file or directory]
tetapi file tersebut dapat ditemukan dimana:
# which mycommand
/home/me/mydir/admbin/mycommand
Saya juga secara eksplisit melihat direktori itu di $ PATH:
# echo $PATH | tr : '\n' | grep adm
/home/me/mydir/admbin
Exe di lokasi itu tampak normal:
# file /home/me/mydir/admbin/mycommand
/home/me/mydir/admbin/mycommand: setuid setgid ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped
# ls -l mycommand
-r-sr-s--- 1 me mygroup 97892 2012-04-11 18:01 mycommand
dan jika saya menjalankannya secara eksplisit menggunakan jalur yang sepenuhnya memenuhi syarat:
# /home/me/mydir/admbin/mycommand
Saya melihat output yang diharapkan. Pasti ada sesuatu yang membingungkan shell di sini, tapi aku bingung apa yang bisa terjadi?
EDIT: menemukan apa yang tampak seperti pertanyaan serupa: Biner tidak akan mengeksekusi ketika dijalankan dengan path. Misalnya> ./ Program tidak akan berfungsi tetapi> program bekerja dengan baik
Saya juga menguji lebih dari satu perintah seperti itu di $ PATH saya, tetapi hanya menemukan satu:
# for i in `echo $PATH | tr : '\n'` ; do test -e $i/mycommand && echo $i/mycommand ; done
/home/me/mydir/admbin/mycommand
EDIT2:
Sampai pagi ini, masalahnya telah hilang , dan saya sekarang dapat mengeksekusi dieksekusi.
Itu bisa dianggap sebagai memvalidasi saran untuk logout dan login, tetapi saya telah melakukan itu tadi malam tanpa hasil. Logout / login itu juga harus melakukan yang setara dengan menjalankan perintah 'hash -r' yang disarankan (yang fwiw juga tampaknya menjadi ksh builtin, dan bukan hanya bash builtin).
Menanggapi beberapa jawaban:
Ini adalah executable bukan skrip (lihat referensi ELF di output perintah file).
Saya tidak berpikir bahwa suatu langkah akan membantu. Itu akhirnya memaksa perintah untuk menjalankan sepenuhnya memenuhi syarat. Saya kira saya bisa melakukan strace menempel pada shell saat ini, tetapi karena saya tidak bisa lagi menegur tidak ada gunanya mencoba itu.
tidak ada titik koma di $ PATH. Karena saya tidak dapat lagi menegur, saya tidak akan mengacaukan pertanyaan ini dengan $ PATH lengkap.
mencoba shell lain (yaitu bash) akan menjadi sesuatu yang juga telah saya coba, seperti yang disarankan. Dengan masalah yang hilang, saya sekarang tidak akan tahu apakah itu akan membantu.
Saya juga menyarankan agar saya memeriksa izin direktori. Melakukannya, untuk masing-masing direktori hingga yang ini saya melihat:
# ls -ld $HOME $HOME/mydir $HOME/mydir/admbin
drwxr-xr-x 10 me root 4096 2012-04-12 12:20 /home/me
drwxrwsr-t 22 me mygroup 4096 2012-04-12 12:04 /home/me/mydir
drwxr-sr-x 2 me mygroup 4096 2012-04-12 12:04 /home/me/mydir/admbin
Kepemilikan direktori $ HOME kacau (tidak boleh root grup). Itu bisa menyebabkan masalah lain, tapi saya tidak melihat bagaimana ini menyebabkan hal ini.
Jawaban:
Anda mungkin perlu memperbarui cache item Anda di shell
$PATH
menggunakan Andahash -r
.sumber
$ apropos hash | grep ksh
-- tidak ada. Anda telah menjawab denganbash
built-in, tetapi itu bukan shell yang dimaksud.Juga, dalam kasus seperti itu, periksa apa yang terjadi ketika program dipanggil dengan melewatkan executable sebagai argumen ke dynamic linker (mungkin menolak untuk melakukannya saat setuid / setgid pada beberapa sistem).
ldd (1) output dari kedua kasus mungkin juga mengungkapkan. "tidak ada file atau direktori" pada file yang dapat dieksekusi benar-benar berarti bahwa penghubung dinamis yang ditentukan dalam file yang dapat dieksekusi tidak dapat ditemukan (bayangkan file yang dapat dieksekusi memiliki ELFin dari #! / lib / ld-linux.what.so.ever di dalam)
Perilaku ini membuat orang-orang tercengang yang ada di sana untuk menyaksikan akhir era libc5, dan sekarang kadang-kadang membuat orang-orang tercengang di era campuran i386 / amd64 dengan berbagai cara mendukung dua set perpustakaan di alam liar.
RPATH relatif dalam executable vs $ PWD?
PS pertanyaan lain terkait dengan MacOSX, yang mungkin menggunakan dyld dan bukan linker yang disediakan libc. Jenis binatang yang sangat berbeda.
sumber
Baiklah, saya tidak punya jawaban. Saya memang membuktikan beberapa hal dan berpikir saya dapat menambahkan ini nanti:
Jadi, dari semua akun, saya masih bingung. Hanya untuk menyeringai dan jika ini adalah bug yang berhubungan dengan shell, dapatkah Anda mencobanya dengan shell yang berbeda?
sumber
Saya menduga bahwa skrip Anda tidak memiliki shell yang valid setelah # !. Misalnya, pada beberapa sistem SCO yang lebih lama, skrip dengan #! / Bin / bash tidak berfungsi karena bash BENAR-BENAR hidup di / usr / bin / bash. Bodoh, tapi hei SCO hampir mati karena suatu alasan, bukan?
Periksa shell Anda dan pastikan itu menunjuk ke biner / skrip nyata.
Sunting: Tidak tahu apakah ini skrip atau biner, tetapi dengan asumsi output 'ls-l' Anda benar, maka Anda mungkin tidak memiliki skrip 93kbyte ... jadi ini mungkin biner yang artinya jawaban saya adalah sama sekali tidak benar.
Sudahkah Anda mencoba keluar dan kembali? Saya tahu jika saya menggunakan biner yang ada di / usr / bin kemudian menginstal versi / usr / local / bin dari sumber, sistem masih mencoba untuk mengeksekusi yang asli sampai saya logout dan kembali.
sumber
Tebakan saya:
Anda memiliki alias yang bernama
mycommand
. Sebagai contoh:Anda memiliki fungsi bernama
mycommand
. Sebagai contoh:Lain kali jika Anda memiliki masalah ini, coba jalankan
command -V mycommand
untuk melihat perintah seperti apa yang diyakini shellmycommand
.sumber
Tidak ada jawaban, hanya sekelompok pemikiran:
sumber
Saya memiliki masalah yang persis sama, dan gagal menemukan jawaban karena masalah poster asli terselesaikan dengan sendirinya. Tetapi ini tidak berhasil untuk saya, dan saya akhirnya berhasil melacak masalahnya. Jadi saya menambahkan yang berikut sebagai jawaban untuk posting asli.
Gejala yang saya hadapi adalah sebagai berikut. Ada skrip (myscript.pl) di direktori / my / home. Sekarang mencoba menjalankannya:
Izin file yang terverifikasi (flag eksekusi sudah diatur). Terverifikasi $ PATH (meskipun seharusnya tidak ada masalah).
Jadi saya coba (setelah memverifikasi flag yang dapat dieksekusi diatur pada skrip):
Hmmm ... Jadi mungkin skrip tidak memanggil bahasa skrip yang tepat (perl, dalam hal ini). Bagian atas skrip memiliki sihir yang benar:
dan memang / usr / bin / perl ada dan berfungsi. Jadi panggilan berikut berfungsi dengan benar.
tab lengkapi-otomatis tidak akan menampilkan file (baik dalam
tcsh
maupun dalambash
).Ini benar-benar membuat saya marah. Kemudian teringat bahwa beberapa bulan yang lalu hard disk saya rusak, dan administrator sistem muda di lab saya menginstal ulang sistem. Kupikir dia mungkin telah mengacaukan izin pada partisi. Dan memang, di
/etc/fstab
, izin eksekutif itu hilang!Dari pada
Memperbaiki ini dengan mengubah
/etc/fstab
dan mengirim ulang:Ini menyelesaikan masalah sepenuhnya. Dugaan saya adalah bahwa hal serupa mungkin terjadi dengan masalah poster asli, kecuali bahwa ada masalah izin yang terputus-putus (misalnya, ada perubahan sementara yang mungkin telah diselesaikan dengan reboot, jika terjadi).
sumber
Bukan jawaban lengkap, tetapi ingin melaporkan pengalaman saya karena saya memiliki masalah yang sama persis dengan si penanya, dan berpikir itu mungkin membantu pengguna di masa depan yang mengalami masalah menjengkelkan yang sama. Saya dapat file yang mana, dan melihatnya di jalur saya, dan bahkan menjalankannya dengan memberikan path lengkap, tetapi tidak bisa menjalankannya sebaliknya. Namun, dalam kasus saya, itu hanya terjadi di dalam sub-shell (yaitu ketika dieksekusi dari skrip, dalam kasus ini ada beberapa sub-shell bersarang). Saya bisa menjalankannya dari baris perintah dengan baik.
Tepat sebelum perintah dalam skrip bersarang, saya mencetak perintah, misalnya echo $ (yang perintah saya)
mycommand: / home / me / bin / mycommand
Maka saya akan mencoba menjalankannya dari skrip induk:
/ home / me / bin / some_parent_script [72]: mycommand: not found [Tidak ada file atau direktori]
Sama seperti si penanya, saya tidak dapat mendiagnosis sumber masalahnya. PATH saya tampak benar, itu mana yang bisa, dan hash tidak mengungkapkan entri perintah saya sebelumnya. Hari berikutnya ketika saya masuk, semuanya secara ajaib bekerja lagi. Sekarang, saya akan perhatikan di sini bahwa ada masalah sistem yang diketahui terjadi sebelum saya melihat masalah ini di mana mount dipasang kembali. Mungkin itu sebuah petunjuk?
Jika saya tidak memiliki file log setelah file log yang menunjukkan bahwa ini terjadi, saya tidak akan percaya itu mungkin! Berkat si penanya, saya tidak lagi merasa gila!
PS Saya tidak berpikir user226160 memiliki masalah yang sama PERSIS dengan reporter, tapi kedengarannya terkait, dan meminjamkan kepercayaan kepada teori mount.
sumber