GNU/Linux >> Belajar Linux >  >> Linux

Banyak Argumen Di Shebang?

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 coreutilsenv 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.)


Linux
  1. Dd:Beberapa File Input?

  2. Jalankan beberapa skrip python secara bersamaan

  3. Simpan beberapa tata letak terminal gnome?

  1. Cara Menambahkan Banyak Host di phpMyAdmin

  2. Cara menyampaikan beberapa argumen untuk dieksekusi dengan skrip .sh

  3. shebang atau bukan shebang

  1. Cara Membuat Zip Banyak File di Linux

  2. Bagaimana Cara Melewati Parameter Ke Alias?

  3. Bagaimana Cara Mengirim Stdout Ke Beberapa Perintah?