awk
dapat menjalankan awk
fungsi. Agar dapat menjalankan bash
fungsi, Anda perlu awk
mengeksekusi bash
shell, bash
untuk menginterpretasikan definisi fungsi itu, dan memanggil fungsi itu, dengan nilai yang diekstraksi dengan awk
diteruskan sebagai argumen.
Tidak sepele.
bash
mendukung fungsi ekspor sehingga tersedia dalam pemanggilan berikutnya bash
, jadi itu salah satu cara untuk meneruskan definisi fungsi ke pemanggilan bash
oleh awk
:
export -f d2h
Satu-satunya cara untuk awk
menjalankan perintah (di bash
sini) adalah dengan system("cmd")
, atau print... | "cmd"
atau "cmd" | getline
. Dalam semua kasus, awk
jalankan shell untuk menafsirkannya cmd
, tetapi itu akan menjadi sh
, bukan bash
. Jadi, Anda perlu membuat baris perintah untuk sh
itu adalah bash
doa yang menginterpretasikan bash
baris perintah untuk memanggil fungsi, jadi Anda harus berhati-hati dengan mengutip:
export -f d2h
<file awk -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{print $1; system("bash -c '\''d2h \"$1\"'\'' bash " shquote($2))}'
Itu berarti menjalankan satu sh
dan satu bash
untuk setiap baris, sehingga akan menjadi sangat tidak efisien. Itu akan menjadi jauh lebih tidak efisien daripada bash
membaca dan membelah dengan while read loop
:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2h
dapat dieksekusi, tetapi tidak jika itu merupakan "fungsi yang didefinisikan baik dalam .bashrc atau dalam skrip shell".