awkdapat menjalankan awkfungsi. Agar dapat menjalankan bashfungsi, Anda perlu awkmengeksekusi bashshell, bashuntuk menginterpretasikan definisi fungsi itu, dan memanggil fungsi itu, dengan nilai yang diekstraksi dengan awkditeruskan sebagai argumen.
Tidak sepele.
bashmendukung fungsi ekspor sehingga tersedia dalam pemanggilan berikutnya bash, jadi itu salah satu cara untuk meneruskan definisi fungsi ke pemanggilan basholeh awk:
export -f d2h
Satu-satunya cara untuk awkmenjalankan perintah (di bashsini) adalah dengan system("cmd"), atau print... | "cmd"atau "cmd" | getline. Dalam semua kasus, awkjalankan shell untuk menafsirkannya cmd, tetapi itu akan menjadi sh, bukan bash. Jadi, Anda perlu membuat baris perintah untuk shitu adalah bashdoa yang menginterpretasikan bashbaris 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 shdan satu bashuntuk setiap baris, sehingga akan menjadi sangat tidak efisien. Itu akan menjadi jauh lebih tidak efisien daripada bashmembaca dan membelah dengan while read loop:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2hdapat dieksekusi, tetapi tidak jika itu merupakan "fungsi yang didefinisikan baik dalam .bashrc atau dalam skrip shell".