Apakah ada jaminan bahwa / usr / bin / env akan ada?

8

Seringkali saya akan melihat skrip dimulai dengan garis shebang yang digunakan #!/usr/bin/env interpreter_nameuntuk penerjemah apa pun, dengan alasan bahwa sistem yang berbeda mungkin memiliki penerjemah yang mereka butuhkan untuk menjalankan diinstal di tempat yang berbeda. Sebagai contoh, jika saya menganggap pythondiinstal sebagai /usr/bin/pythonmaka beberapa pengguna yang memutuskan untuk menginstalnya /opt/pythonkarena alasan tertentu tidak akan dapat menggunakannya dengan mudah.

Tetapi pertanyaan yang jelas adalah, apakah ada jaminan yang envakan dipasang di /usr/bin/env(atau dalam hal ini tempat tertentu), atau apakah ini hanya kasus "memindahkan masalah"?

Pertanyaan yang sedikit terkait ini memiliki komentar yang mengatakan itu adalah ide yang buruk dan lebih baik untuk menginstalnya dengan jalur penerjemah yang sebenarnya dan mengutip spesifikasi unix tunggal tetapi tidak benar-benar menjawab pertanyaan ini.

scott_fakename
sumber

Jawaban:

6

Tidak, envtidak dijamin masuk /usr/bin, karena Anda dapat membaca dalam sejarah mekanisme shebang , di bagian "Utilitas env":

Namun, lokasi env (1) mungkin berbeda. Free-, Net-, OpenBSD, dan beberapa distribusi Linux (mis. Debian) hanya datang dengan / usr / bin / env. Di sisi lain, hanya ada / bin / env setidaknya pada SCO OpenServer 5.0.6 dan Cray Unicos 9.0.2 (meskipun yang terakhir hanya menarik sejarah). Pada beberapa distribusi Linux lainnya (Redhat) terletak di / bin dan / usr / bin / berisi tautan simbolik yang menunjuk ke sana.

Itu tidak memindahkan masalah sepenuhnya, karena fleksibilitas envpencarian $PATH. Jika Anda kebetulan mendapatkan beberapa script yang menggunakan lokasi yang berbeda untuk envdari Anda, Anda hanya harus tahu tentang di mana Anda envhidup, dan tidak juga di mana perl, pythondan penerjemah lain mungkin dipasang.

Dan Anda tidak perlu kode keras /opt/python/3.3.2/bin/python3.3jika itu adalah python3.3executable pertama di PATH Anda. Anda bisa mengandalkan envmenemukannya, jadi Anda tidak perlu memperbarui masing-masing dan setiap skrip jika Anda memutakhirkan untuk menggunakan /opt/python/3.3.3/bin/python3.3. Header skrip Anda tetap sama:

#! /usr/bin/env python3.3
Anthon
sumber
Aha. Terima kasih. Saya tidak dapat menemukan informasi tentang itu. Ketika saya mengatakan "memindahkan" masalah yang saya maksudkan alih-alih mencari python perldll, Anda sekarang hanya harus memburu env, jadi masalah yang sama, tetapi target yang berbeda. Tampaknya itu envjauh lebih mudah ditemukan, dan jelas jauh lebih fleksibel, sehingga masih sangat menguntungkan. Yang menjawab pertanyaan saya dengan sempurna. Terima kasih!
scott_fakename