Mengapa menggunakan env di shebang?

19

Apa tujuan menggunakan #!/usr/bin/env <sh|bash|python>shebang dibandingkan dengan #!/bin/bash, #!/bin/shatau #!/usr/bin/python?

Tuminoid
sumber
4
Ada jawaban yang bagus di sini sehubungan dengan penggunaan env secara umum.
Kevin Bowen

Jawaban:

11

Beberapa orang mungkin menggunakan python berbeda (perl, dll.) Daripada yang satu sistem. /usr/bin/env pythonakan menjalankan versi yang dikonfigurasikan sebagai versi saat ini, mungkin membuat skrip lebih portabel.

Di sisi lain, kabarnya, beberapa sistem tidak memiliki /usr/bin/env. Juga, Anda tidak dapat menggunakan #!/usr/bin/env foo xsebagai pengganti #!foo x, karena foo xakan ditafsirkan sebagai argumen tunggal. Jadi nilai pendekatannya bisa diperdebatkan.

choroba
sumber
1
Dikonfigurasi dimana? Dari info coreutils 'env invocation'saya dapat melihat bentuk panggilan ini memastikan itu adalah biner eksternal, bukan shell built-in, tetapi tidak ada indikasi bagaimana env pythonbedanya python?
Tuminoid
4
Anda PATHmungkin termasuk yang /usr/local/binpertama. Jika seseorang telah menginstal python secara manual di sana, maka envakan memanggilnya, sedangkan #!/usr/bin/pythonakan memotongnya.
Robie Basak
2
virtualenvadalah alat yang cukup populer, dan menginstal python executable di direktori kerja. Anda akan membutuhkan envtrik untuk membuatnya berfungsi dengan benar.
Flimm
2
@ Tuminoid: Anda benar: env pythonsama dengan python. Namun masalahnya adalah Anda tidak bisa menulis seperti shebang #!python: Anda harus menentukan path lengkap.
Andrea Corbellini