Di bash $0
berisi nama skrip, tetapi awk jika saya membuat skrip bernama myscript.awk dengan konten berikut:
#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }
dan jalankan, itu hanya akan mencetak "awk". Selain itu, ARGV [i] dengan i> 0 digunakan hanya untuk argumen skrip di baris perintah. Jadi, bagaimana cara membuatnya mencetak nama skrip, dalam hal ini "myscript.awk"?
mawk
default di Ubuntu? Pada 15,04 VM saya, standarnyaawk
adalahgawk
. Sementara mawk diinstal, itu bukan default.awk -f myscript.awk
. Namun, ini tidak terkait dengan masalah yang dimaksud.awk
skrip karena dimulai dengan#!/usr/bin/awk -f
. Skrip shell dimulai dengan#!/bin/sh
(atau yang serupa).awk -f file
.Jawaban:
Dengan GNU awk 4.1.3 di bash on cygwin:
Saya tidak tahu seberapa portabel itu. Namun, seperti biasa, saya tidak akan menjalankan skrip awk menggunakan shebang dalam skrip shell karena hanya merampas kemungkinan fungsionalitas Anda. Tetap sederhana dan lakukan saja ini sebagai gantinya:
Yang terakhir akan bekerja dengan awk modern di shell apa pun di platform apa pun.
sumber
ENVIRON["_"]
berfungsi dengan baik, dan tidak memanggil program eksternal apa pun. Opsi keduaawk -v ...
tergantung pada bagaimana seseorang menjalankan skrip; Saya tidak menginginkan ini.tst.sh
menyesatkan. Ini sebuahawk
skrip, bukan skrip shell.BEGIN
bukan perintah shell yang valid.ENVIRON["_"]
menghasilkan jalur skrip panggilan ketika dicetak dari setiap awk yang dipanggil melalui shebang dari setiap shell"? Saya tidak akan pernah memanggil skrip awk dari shebang karena saya pribadi tidak peduli dengan jawabannya tetapi hanya berpikir saya akan menyebutkannya .... Oh saya lihat di komentar di atas bahwa @cuonglm menjawab bahwa itu hanya didukung di beberapa shell .*12345*/tmp/test.awk
.ARGV[0]
andal selaluawk
dalam tanda hubung, bash, zsh, dan ksh93.Saya rasa ini tidak mungkin sesuai
gawk
dokumentasi :Pada
linux
Anda dapat mencoba menggunakan jenis peretasan yang kotor dan seperti yang ditunjukkan dalam komentar oleh Stéphane Chazelas , adalah mungkin jika implementasiawk
dukungan NUL byte:sumber
gawk
dan gagal (seperti uraian Anda)mawk
. Menarik!awk
- 4.0.2. Dalam freebsd dengan/proc/curpoc/cmdline
, danawk
hasilnya seperti milik Anda tetapi bekerja dengannyagawk
.awk -vNAME="myscript.awk" ./myscript.awk
dan kemudian mencetak NAMA di dalam skrip. Bukan solusi.Saya tidak tahu cara langsung untuk mendapatkan nama perintah dari dalam awk. Namun Anda dapat menemukannya melalui sub-shell.
melongo
Dengan GNU awk dan
ps
perintah Anda dapat menggunakan ID proses dariPROCINFO["PID"]
untuk mengambil nama perintah sebagai solusinya. Sebagai contoh:cmdname.awk
mawk dan nawk
Anda dapat menggunakan pendekatan yang sama, tetapi mendapatkan
awk
PID dari$PPID
variabel shell khusus (PID dari induk):cmdname.awk
Pengujian
Jalankan skrip seperti ini:
Output dalam kedua kasus:
sumber
gawk
itu adalahgawk
solusi, bukanawk
solusi. Saya pikir @cipper harus menambahkan keinginannya "solusi portabel" ke pertanyaan.awk -vNAME="myscript.awk" ./myscript.awk
dan kemudian mencetak NAMA di dalam skrip. Bukan solusi.Dengan POSIX
awk
:Kemudian:
sumber
awk -vNAME="myscript.awk" ./myscript.awk
dan kemudian mencetak variabelNAME
di dalam skrip. Bukan solusi.mawk
. Dan juga menggunakanENVIRON
tidak sama dengan menggunakan-vNAME="myscript.awk"
, karena kapanmawk
akan memperluas urutan escapeNAME
.Menggunakan GNU awk
Memeriksa panduan pengguna GNU awk - 7.5.2 Variabel Internal yang Menyampaikan Informasi yang saya temui:
Ini berarti bahwa Anda dapat mengetahui PID program saat runtime. Kemudian, itu adalah masalah menggunakan
system()
untuk mencari proses dengan PID yang diberikan ini:Saya menggunakan
ps -ef
, yang menampilkan PID pada kolom ke-2. Dengan asumsi eksekusi dilakukan melaluiawk -f <script>
dan tidak ada parameter lain, kita dapat mengasumsikan bidang terakhir dari baris berisi informasi yang kita inginkan.Jika kita memiliki beberapa parameter, kita harus menguraikan baris secara berbeda -atau, lebih baik, gunakan beberapa opsi
ps
untuk mencetak hanya kolom yang kita minati.Uji
Perhatikan juga bahwa bab lain dari panduan pengguna awk GNU memberi tahu kita bahwa ARGV bukanlah jalan yang harus ditempuh:
sumber
mawk
dan tidak bisa membuatnya bekerja, sehingga saya instalgawk
di Ubuntu saya dan itu berhasil. Jadi solusinya dapat menggunakangawk
: Dgawk
tidak diinstal secara default di Ubuntu (atau setidaknya beberapa versi Ubuntu, di mana implementasimawk
defaultawk
). IIRC, saya harus menginstalnya juga di Debian.