Saya mengalami beberapa masalah ketika menjalankan beberapa skrip instalasi di mana mereka mengeluh bad interpreter
.
Jadi saya membuat contoh sepele tetapi saya tidak bisa mencari tahu apa masalahnya, lihat di bawah.
#!/usr/bin/env bash
echo "hello"
Menjalankan skrip di atas menghasilkan kesalahan berikut
[root@ech-10-24-130-154 dc-user]# ./junk.sh
bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory
The /usr/bin/env
berkas ada, lihat di bawah:
[root@ech-10-24-130-154 dc-user]# ls -l /usr/bin/env
lrwxrwxrwx 1 root root 13 Jan 27 04:14 /usr/bin/env -> ../../bin/env
[root@ech-10-24-130-154 dc-user]# ls -l /bin/env
-rwxr-xr-x 1 root root 23832 Jul 16 2014 /bin/env
[root@ech-10-24-130-154 dc-user]#
Jika saya mengubah script untuk menggunakan shebang biasa #!/bin/bash
itu berfungsi tidak masalah. #!/bin/env bash
berfungsi juga.
Apa yang hilang dari lingkungan untuk memungkinkan shebang portabel berfungsi?
ls -lL /usr/bin/env
kembali ls: cannot access /usr/bin/env: No such file or directory
jadi saya kira saya perlu mengubah tautan simbolik? Bisakah saya menunjukkannya /bin/env
?
env --version
adalah 8.4 dan OS adalah Red Hat Enterprise Linux Server rilis 6.6.
sumber
Jawaban:
ls -lL /usr/bin/env
menunjukkan bahwa tautan simbolik terputus. Itu menjelaskan mengapa garis shebang tidak berfungsi: kernel mencoba, dan jelas gagal, untuk mengeksekusi tautan simbolik yang menjuntai./usr/bin/env -> ../../bin/env
benar jika/usr
dan/usr/bin
keduanya direktori aktual (bukan symlinks). Jelas ini tidak terjadi pada mesin Anda. Mungkin/usr
tautan simbolis? (Jelas itu bukan tautan simbolik ke/
, jika tidak/usr/bin/env
akan menjadi file yang sama dengan/bin/env
, bukan tautan simbolik).Anda perlu memperbaiki tautan simbolis itu. Anda dapat menjadikannya tautan mutlak:
Anda dapat menjadikannya tautan relatif, tetapi jika Anda melakukannya, pastikan itu benar. Beralih ke
/usr/bin
dan jalankanls -l relative/path/to/bin/env
untuk mengonfirmasi bahwa Anda sudah benar sebelum membuat symlink.Ini bukan pengaturan RHEL default, jadi Anda harus memodifikasi sesuatu secara lokal. Coba cari tahu apa yang Anda lakukan dan apakah itu dapat menyebabkan masalah serupa lainnya.
sumber
/usr/bin
dipindahkan ke sistem file lain dan merupakan tautan simbolis ke/vol_01/usr/bin
Di sini (Fedora 23)
/bin
adalah tautan simbolis ke/usr/bin
; jika Anda memiliki pengaturan yang serupa, tautan simbolik dari/usr/bin/env
baru saja membeli Anda sebuah loop tak terbatas.Periksa paket yang relevan, yaitu
rpm -qf /usr/bin/env /bin/env
, dan instal ulang paket tersebut (di sinicoreutils
, mis.yum reinstall coreutils
Atau yang serupa) Itu harus memperbaiki kesalahan penanganan.sumber
coreutils
tetapi itu tidak membuat perbedaan. Cukup aneh./usr/bin/env
adalah tautan simbolik dengan jalur relatif ke targetnya../../bin/env
. Sehingga harus/bin/env
yang juga ada. Jadi saya tidak mengerti mengapa tautan simbolis itu tidak berfungsi. Saya mengganti target sehingga menunjuk ke/bin/env
jalur absolut dan sepertinya berhasil./bin
tautan simbolis ke/usr/bin
sistem conorgriffin, maka/usr/bin/env
dan/bin/env
akan menjadi file yang sama.