Apakah biasanya gawk di / bin atau / usr / bin? Saya akan pergi dengan #!/usr/bin/env gawk
tetapi kemudian saya tidak bisa menggunakan argumen. Saat ini saya sedang menggunakan #!/bin/gawk -f
. Scriptnya sangat panjang dan berisi banyak tanda kutip tunggal dan bekerja dengan stdin.
Manual GNU Awk memiliki bagian 1.1.4 Program awk yang dapat dijalankan di mana ia menggunakan #! / Bin / awk dalam contohnya tetapi selanjutnya mengatakan:
Perhatikan bahwa pada banyak sistem
awk
dapat ditemukan/usr/bin
alih-alih pada/bin
. Caveat Emptor.
Apa yang dilakukan kebanyakan orang? Saya telah membaca sed seharusnya standar di / bin sedangkan perl seharusnya standar di / usr / bin (halaman yang sama dengan tautan sed tetapi mereka tidak akan membiarkan saya membuat tautan ketiga untuk posting ini). Bagaimana dengan awk / gawk? Adakah yang tahu yang lebih umum atau populer?
-f
? Tidak/bin/gawk
cukup? Juga, ini mungkin relevan.Jawaban:
Shebang tidak seharusnya fleksibel . Mungkin ada beberapa kasus di mana parameter kedua berfungsi , saya pikir FreeBSD adalah salah satunya.
melongo dan paling utilitas yang datang dengan OS diharapkan dalam
/usr/bin/
.Pada hari-hari UNIX yang lebih lama, sudah biasa untuk
/usr/
dipasang di NFS atau media yang lebih murah untuk menghemat ruang disk lokal dan biaya per workstation./bin/
seharusnya memiliki semua yang diperlukan untuk boot dalam mode pengguna tunggal . Karena/usr/
tidak dipasang pada media yang andal,/bin/
termasuk cukup banyak utilitas untuk membuatnya cukup ramah untuk administrasi umum dan pemecahan masalah.Awalnya ini diwarisi di Linux, tetapi karena ruang disk tidak lagi menjadi masalah dan dalam kebanyakan kasus
/usr/
ada di sistem file root, tren saat ini adalah untuk memindahkan semuanya/usr/bin
(setidaknya di dunia Linux). Jadi sebagian besar utilitas yang dipasang oleh distro diharapkan dapat ditemukan di sana. Bahkan yang paling utilitas dasar, seperticp
,rm
,ls
dll (baik, belum).Mengenai pilihan shebang. Secara tradisional, ini adalah sesuatu yang harus diedit oleh admin atau pengguna sesuai dengan lingkungannya. Untuk semua yang diketahui pengembang, dalam sistem orang lain, penerjemah bisa berada di mana saja di sistem file (mis.
/usr/local/bin
,/opt/gawk-4.0.1/bin
). Skrip yang dikemas dengan benar (rpm, deb, dll.) Datang dengan ketergantungan pada paket distro (mis. Penerjemah memiliki lokasi yang diketahui) atau skrip konfigurasi yang mengatur hashbang yang tepat selama instalasi.sumber
Jika Anda tidak perlu meneruskan argumen ke perintah maka itu
#!/usr/bin/env gawk
adalah cara untuk pergi, namun banyak kernel (termasuk Linux) hanya menerima argumen tunggal ke program shebang.Jika tidak, Anda bisa membuat program polyglot yang merupakan pembungkus shell dan skrip awk. Ini satu untuk awk.
Penguraian shell:
true + /;
- perintahtrue
(yang tidak melakukan apa-apa) dengan dua argumen inert+
dan/
.gawk
. Ini bisa berupa cuplikan shell yang tidak mengandung baris baru dan di mana garis miring ditulis\/
(shell tidak keberatan kecuali di dalam tanda kutip).Panggilan digunakan
exec
untuk mengganti shell dengan gawk alih-alih mengeksekusi gawk sebagai subproses.exit;
- keluar dari shell, seandainya gawk tidak ditemukan. Apa pun setelah itu diabaikan, kecuali bahwa itu harus sintaks shell yang valid jika shell mencoba untuk menguraikan seluruh baris sebelum mulai menjalankannya.Penguraian awk:
true + /REGEX/
- sebuah kondisi.true
adalah variabel yang tidak terdefinisi sehingga nilai numeriknya adalah 0, tidak penting.{}
- Jika kondisi tersebut berlaku, jangan lakukan apa pun.sumber
Solusi yang diusulkan Gilles memang merupakan pendekatan yang sangat baik (akhirnya memiliki reputasi untuk memilih dalam jabatannya :)).
Bagaimanapun, sejauh yang saya mengerti
exec
perintah, itu membuatexit
hak setelah itu tidak perlu, sebenarnya tidak dapat dijangkau, karena proses shell diganti olehawk
.Selain itu, untuk memungkinkan
awk
skrip mengakses parameter doa, saya akan menyarankan beberapa perubahan dalam solusi yang diusulkan:The
-a "$0"
memungkinkan script untuk memiliki akses ke nama doa nya, selain itu akan selalu mendapatkanawk
ataugawk
ketika mengaksesARGV[0]
variabel. Demikian pula,"$@"
memungkinkan skrip untuk mengakses parameter yang tersisa dalamARGV[1...N]
array dan--
sebelumnya memungkinkan skrip untuk menerima-<something>
argumen tanpa gawk menafsirkannya dimaksudkan untuk itu.Satu hal yang perlu diingat / dipertimbangkan adalah menambahkan
exit(0);
pernyataan di akhirBEGIN { ... }
blokawk
program skrip, jika tidakawk
akan mengancam semua parameter yang diteruskan ke skrip sebagai file input. (Harap dicatat bahwa itu tidak ada hubungannya, sama sekali, denganexit
pernyataan yang kami hapus daritrue + ...
baris, ini adalah pernyataan shell yang tidak dapat dijangkau saat keluar yang disarankan ini ada dalam kode awk).sumber
exit(0)
sangat berguna! Juga, untuk pengguna macos, lihat intisari ini: Shebang portabel yang bagus tidak mudah ditemukan.