Saya bertanya-tanya apakah ada cara umum untuk meneruskan beberapa opsi ke yang dapat dieksekusi melalui baris Shebang (#!
).
Saya menggunakan NixOS, dan bagian pertama dari shebang dalam skrip apa pun yang saya tulis biasanya /usr/bin/env
. Masalah yang saya temui kemudian adalah bahwa semua yang muncul setelahnya ditafsirkan sebagai satu file atau direktori oleh sistem.
Misalkan, misalnya, saya ingin menulis skrip yang akan dieksekusi oleh bash
dalam mode posix. Cara penulisan shebang yang naif adalah:
#!/usr/bin/env bash --posix
tetapi mencoba mengeksekusi skrip yang dihasilkan menghasilkan kesalahan berikut:
/usr/bin/env: ‘bash --posix’: No such file or directory
Saya mengetahui posting ini, tetapi saya bertanya-tanya apakah ada solusi yang lebih umum dan lebih bersih.
EDIT :Saya tahu bahwa untuk skrip Guile, ada cara untuk mencapai apa yang saya inginkan, didokumentasikan di Bagian 4.3.4 manual:
#!/usr/bin/env sh
exec guile -l fact -e '(@ (fac) main)' -s "$0" "[email protected]"
!#
Triknya, di sini, adalah baris kedua (dimulai dengan exec
) ditafsirkan sebagai kode oleh sh
tapi, berada di #!
… !#
blok, sebagai komentar, dan dengan demikian diabaikan, oleh penerjemah Guile.
Apakah tidak mungkin untuk menggeneralisasi metode ini ke penerjemah mana pun?
EDIT Kedua :Setelah bermain-main sedikit, tampaknya, untuk interpreter yang dapat membaca input mereka dari stdin
, metode berikut akan berhasil:
#!/usr/bin/env sh
sed '1,2d' "$0" | bash --verbose --posix /dev/stdin; exit;
Ini mungkin tidak optimal, karena sh
proses hidup sampai interpreter menyelesaikan tugasnya. Umpan balik atau saran akan dihargai.
Jawaban yang Diterima:
Tidak ada solusi umum, setidaknya tidak jika Anda perlu mendukung Linux, karena kernel Linux memperlakukan semua yang mengikuti "kata" pertama di baris Shebang sebagai argumen tunggal.
Saya tidak yakin apa batasan NixOS, tetapi biasanya saya hanya akan menulis shebang Anda sebagai
#!/bin/bash --posix
atau, jika memungkinkan, atur opsi dalam skrip:
set -o posix
Atau, Anda dapat membuat skrip memulai ulang sendiri dengan pemanggilan shell yang sesuai:
#!/bin/sh -
if [ "$1" != "--really" ]; then exec bash --posix -- "$0" --really "[email protected]"; fi
shift
# Processing continues
Pendekatan ini dapat digeneralisasi ke bahasa lain, selama Anda menemukan cara agar beberapa baris pertama (yang ditafsirkan oleh shell) diabaikan oleh bahasa target.
Terkait:Bagaimana cara menambahkan beberapa baris ke file?
GNU coreutils
’ env
memberikan solusi sejak versi 8.30, lihat jawaban unode untuk detailnya. (Ini tersedia di Debian 10 dan yang lebih baru, RHEL 8 dan yang lebih baru, Ubuntu 19.04 dan yang lebih baru, dll.)