Mengapa #! / Usr / bin / env bash tidak berfungsi di sistem saya?

11

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/envberkas 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/bashitu berfungsi tidak masalah. #!/bin/env bashberfungsi juga.

Apa yang hilang dari lingkungan untuk memungkinkan shebang portabel berfungsi?

ls -lL /usr/bin/envkembali ls: cannot access /usr/bin/env: No such file or directoryjadi 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.

Conorgriffin
sumber
1
Biasanya itu karena ujung carriage-return / feed-feed pada garis. Atau: lokasi env .
Thomas Dickey

Jawaban:

7

ls -lL /usr/bin/envmenunjukkan 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/envbenar jika /usrdan /usr/binkeduanya direktori aktual (bukan symlinks). Jelas ini tidak terjadi pada mesin Anda. Mungkin /usrtautan simbolis? (Jelas itu bukan tautan simbolik ke /, jika tidak /usr/bin/envakan menjadi file yang sama dengan /bin/env, bukan tautan simbolik).

Anda perlu memperbaiki tautan simbolis itu. Anda dapat menjadikannya tautan mutlak:

sudo ln -snf /bin/env /usr/bin/env

Anda dapat menjadikannya tautan relatif, tetapi jika Anda melakukannya, pastikan itu benar. Beralih ke /usr/bindan jalankan ls -l relative/path/to/bin/envuntuk 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.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ini benar, /usr/bindipindahkan ke sistem file lain dan merupakan tautan simbolis ke/vol_01/usr/bin
conorgriffin
-1

Di sini (Fedora 23) /binadalah tautan simbolis ke /usr/bin; jika Anda memiliki pengaturan yang serupa, tautan simbolik dari /usr/bin/envbaru 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 sini coreutils, mis. yum reinstall coreutilsAtau yang serupa) Itu harus memperbaiki kesalahan penanganan.

vonbrand
sumber
Saya sudah menginstal ulang coreutilstetapi itu tidak membuat perbedaan. Cukup aneh. /usr/bin/envadalah tautan simbolik dengan jalur relatif ke targetnya ../../bin/env. Sehingga harus /bin/envyang juga ada. Jadi saya tidak mengerti mengapa tautan simbolis itu tidak berfungsi. Saya mengganti target sehingga menunjuk ke /bin/envjalur absolut dan sepertinya berhasil.
conorgriffin
Jika /bintautan simbolis ke /usr/binsistem conorgriffin, maka /usr/bin/envdan /bin/envakan menjadi file yang sama.
Gilles 'SANGAT berhenti menjadi jahat'