ทำไม #! / usr / bin / env ทุบตีไม่ทำงานในระบบของฉัน


11

bad interpreterฉันวิ่งเข้าไปในบางประเด็นที่เมื่อทำงานสคริปต์การติดตั้งบางอย่างที่พวกเขาบ่น

ดังนั้นฉันจึงทำตัวอย่างเล็กน้อย แต่ไม่สามารถเข้าใจได้ว่าปัญหาคืออะไรดูด้านล่าง

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

การเรียกใช้สคริปต์ข้างต้นส่งผลให้เกิดข้อผิดพลาดดังต่อไปนี้

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

/usr/bin/envไฟล์ที่มีอยู่ดูด้านล่าง:

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

ถ้าฉันเปลี่ยนสคริปต์เพื่อใช้ shebang ปกติ#!/bin/bashมันก็ไม่มีปัญหา #!/bin/env bashทำงานได้เช่นกัน

สิ่งที่หายไปจากสภาพแวดล้อมที่อนุญาตให้ shebang แบบพกพาทำงานได้?

ls -lL /usr/bin/envส่งคืนls: cannot access /usr/bin/env: No such file or directoryดังนั้นฉันเดาว่าฉันต้องเปลี่ยนลิงค์สัญลักษณ์? ฉันสามารถชี้ไปที่/bin/env?

env --version คือ 8.4 และระบบปฏิบัติการคือ Red Hat Enterprise Linux Server ที่วางจำหน่าย 6.6


1
โดยปกติจะเป็นเพราะการสิ้นสุดการรับคืน / การป้อนบรรทัดบนบรรทัด อีกทางเลือกหนึ่ง: สถานที่ตั้งของ env
Thomas Dickey

คำตอบ:


7

ls -lL /usr/bin/envแสดงให้เห็นว่าลิงค์สัญลักษณ์เสีย นั่นอธิบายว่าทำไมสาย Shebang ไม่ทำงาน: เคอร์เนลพยายามและเห็นได้ชัดว่าล้มเหลวในการรันลิงก์สัญลักษณ์ห้อยต่องแต่ง

/usr/bin/env -> ../../bin/envถูกต้องถ้า/usrและ/usr/binเป็นทั้งไดเรกทอรีจริง (ไม่ใช่ symlinks) เห็นได้ชัดว่านี่ไม่ใช่กรณีของเครื่องของคุณ อาจ/usrจะเป็นลิงค์สัญลักษณ์? (เห็นได้ชัดว่าไม่ใช่ลิงก์สัญลักษณ์ไป/มิฉะนั้น/usr/bin/envจะเป็นไฟล์เดียวกับ/bin/envไม่ใช่ลิงก์สัญลักษณ์)

คุณต้องแก้ไขลิงก์สัญลักษณ์ คุณสามารถทำให้มันเป็นลิงค์แบบสัมบูรณ์:

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

คุณสามารถทำให้มันเป็นลิงค์ที่เกี่ยวข้อง แต่ถ้าคุณทำให้แน่ใจว่ามันถูกต้อง สลับไปที่/usr/binและเรียกใช้ls -l relative/path/to/bin/envเพื่อยืนยันว่าคุณได้รับสิทธิ์ก่อนสร้าง symlink

นี่ไม่ใช่การตั้งค่า RHEL เริ่มต้นดังนั้นคุณต้องแก้ไขบางอย่างในเครื่อง พยายามค้นหาสิ่งที่คุณทำและอาจทำให้เกิดปัญหาอื่น ๆ ที่คล้ายกันหรือไม่


ถูกต้อง/usr/binถูกย้ายไปยังระบบไฟล์อื่นและเป็นลิงก์สัญลักษณ์ไปยัง/vol_01/usr/bin
conorgriffin

-1

ที่นี่ (Fedora 23) /binเป็นลิงก์สัญลักษณ์ไปยัง/usr/bin; หากคุณมีการตั้งค่าที่คล้ายกันลิงก์สัญลักษณ์จาก/usr/bin/envเพียงซื้อวงวนไม่สิ้นสุด

ตรวจสอบแพ็กเกจที่เกี่ยวข้องเช่นrpm -qf /usr/bin/env /bin/envและติดตั้งแพคเกจเหล่านั้นใหม่ (ที่นี่coreutilsเช่นyum reinstall coreutilsหรือคล้ายกัน) ที่ควรแก้ไขการจัดการที่ผิดพลาดใด ๆ


ฉันติดตั้งแล้วcoreutilsแต่ก็ไม่ได้สร้างความแตกต่าง มันค่อนข้างแปลก การเชื่อมโยงสัญลักษณ์กับเส้นทางเทียบกับเป้าหมายของมัน/usr/bin/env ../../bin/envนั่นควรจะเป็นแบบ/bin/envนั้นด้วย ดังนั้นฉันจึงไม่เข้าใจว่าทำไมลิงค์สัญลักษณ์นั้นใช้งานไม่ได้ ฉันเปลี่ยนเป้าหมายเพื่อให้ชี้ไป/bin/envที่เส้นทางที่แน่นอนและดูเหมือนว่าจะใช้ได้
conorgriffin

หาก/binเป็นลิงค์สัญลักษณ์ไปยัง/usr/binในระบบของ conorgriffin แล้ว/usr/bin/envและ/bin/envจะเป็นไฟล์เดียวกัน
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.