awk
Có thể chạy các awk
chức năng. Để nó chạy các bash
hàm, bạn cần awk
thực thi một trình bash
bao, bash
để diễn giải định nghĩa của hàm đó và gọi hàm đó, với giá trị được trích xuất bằng cách awk
chuyển qua làm đối số.
Không tầm thường.
bash
hỗ trợ xuất các hàm để nó có sẵn trong các lần gọi tiếp theo bash
, vì vậy đó là một cách để chuyển định nghĩa của hàm sang lệnh bash
được gọi bởi awk
:
export -f d2h
Các cách duy nhất awk
để thực thi một lệnh ( bash
ở đây) là bằng lệnh system("cmd")
hoặc print... | "cmd"
hoặc "cmd" | getline
. Trong mọi trường hợp, awk
chạy một cái vỏ để giải thích điều đó cmd
, nhưng nó sẽ sh
không bash
. Vì vậy, bạn cần xây dựng một dòng lệnh cho sh
đó là một bash
lời gọi diễn giải một bash
dòng lệnh để gọi hàm, vì vậy bạn cần cẩn thận với trích dẫn:
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))}'
Điều đó không có nghĩa là chạy một sh
và một bash
cho mỗi dòng, do đó sẽ khá kém hiệu quả. Điều đó cuối cùng thậm chí còn kém hiệu quả hơn nhiều so với việc bash
đọc và chia tách với while read loop
:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2h
là một tệp thực thi, nhưng không phải là "hàm được định nghĩa trong .bashrc hoặc trong tập lệnh shell".