Tại sao #! / Usr / bin / env bash không hoạt động trên hệ thống của tôi?


10

Tôi gặp phải một số vấn đề khi chạy một số tập lệnh cài đặt nơi chúng phàn nàn bad interpreter.

Vì vậy, tôi đã làm một ví dụ tầm thường nhưng tôi không thể tìm ra vấn đề là gì, xem bên dưới.

#!/usr/bin/env bash
echo "hello"

Thực thi đoạn script trên dẫn đến lỗi sau

[root@ech-10-24-130-154 dc-user]# ./junk.sh
bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory

Các /usr/bin/envtập tin tồn tại, xem dưới đây:

[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]#

Nếu tôi thay đổi tập lệnh để sử dụng shebang thông thường #!/bin/bashthì nó không hoạt động. #!/bin/env bashlàm việc tốt

Điều gì còn thiếu từ môi trường để cho phép shebang di động hoạt động?

ls -lL /usr/bin/envtrả về ls: cannot access /usr/bin/env: No such file or directoryvì vậy tôi đoán tôi cần phải thay đổi liên kết tượng trưng? Tôi có thể chỉ cho nó /bin/env?

env --version là 8.4 và HĐH là Red Hat Enterprise Linux Server phát hành 6.6.


1
Thông thường đó là do kết thúc vận chuyển trở lại / dòng cấp dữ liệu trên các dòng. Hoặc: vị trí của env .
Thomas Dickey

Câu trả lời:


7

ls -lL /usr/bin/envcho thấy các liên kết tượng trưng bị phá vỡ. Điều đó giải thích tại sao dòng shebang không hoạt động: kernel đang cố gắng và rõ ràng là không thực hiện được một liên kết tượng trưng lơ lửng.

/usr/bin/env -> ../../bin/envlà chính xác nếu /usr/usr/binlà cả hai thư mục thực tế (không phải là liên kết tượng trưng). Rõ ràng đây không phải là trường hợp trên máy của bạn. Có lẽ /usrlà một liên kết tượng trưng? (Rõ ràng đó không phải là một liên kết tượng trưng đến /, nếu không /usr/bin/envsẽ là cùng một tệp /bin/env, không phải là một liên kết tượng trưng).

Bạn cần sửa liên kết tượng trưng đó. Bạn có thể làm cho nó một liên kết tuyệt đối:

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

Bạn có thể làm cho nó một liên kết tương đối, nhưng nếu bạn làm, hãy chắc chắn rằng nó chính xác. Chuyển sang /usr/binvà chạy ls -l relative/path/to/bin/envđể xác nhận rằng bạn đã hiểu đúng trước khi tạo liên kết tượng trưng.

Đây không phải là thiết lập RHEL mặc định, vì vậy bạn phải sửa đổi một cái gì đó cục bộ. Cố gắng tìm hiểu những gì bạn đã làm và liệu điều đó có thể gây ra các vấn đề tương tự khác.


Điều này là chính xác, /usr/binđã được chuyển sang một hệ thống tệp khác và là một liên kết tượng trưng đến/vol_01/usr/bin
conorgriffin

-1

Ở đây (Fedora 23) /binlà một liên kết tượng trưng đến /usr/bin; nếu bạn có một thiết lập tương tự, liên kết tượng trưng từ /usr/bin/envchỉ mua cho bạn một vòng lặp vô hạn.

Kiểm tra các gói có liên quan, nghĩa là rpm -qf /usr/bin/env /bin/env, và cài đặt lại các gói đó (ở đây coreutils, tức là yum reinstall coreutilshoặc tương tự). Điều đó sẽ sửa chữa bất kỳ sai lầm sai lầm.


Tôi đã cài đặt lại coreutilsnhưng điều đó không có sự khác biệt. Nó khá là lạ. /usr/bin/envlà một liên kết tượng trưng với một đường dẫn tương đối đến mục tiêu của nó ../../bin/env. Vì vậy, đó nên được /bin/envtồn tại. Vì vậy, tôi không hiểu tại sao liên kết tượng trưng đó không hoạt động. Tôi đã thay thế mục tiêu để nó chỉ đến /bin/envmột con đường tuyệt đối và điều đó dường như đã có hiệu quả.
conorgriffin

Nếu /binlà một liên kết tượng trưng đến /usr/bintrên hệ thống của conorgriffin, thì /usr/bin/env/bin/envsẽ là cùng một tệp.
Gilles 'SO- ngừng trở nên xấu xa'
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.