man printf.1
có ghi chú ở dưới cùng: "... shell của bạn có thể có phiên bản riêng của printf
...". Câu hỏi này được gắn thẻ cho bash
, nhưng nếu có thể, tôi cố gắng viết script di động vào bất kỳ trình bao nào . dash
thường là một cơ sở tốt tối thiểu cho tính di động - vì vậy câu trả lời ở đây làm việc tại bash
, dash
, & zsh
. Nếu một tập lệnh hoạt động trong 3 điều đó, rất có thể nó có thể di động đến bất cứ đâu.
Việc triển khai mới nhất của printf
trong dash
[1] không tô màu đầu ra với%s
định dạng có ký tự thoát ANSI \e
- nhưng, một mã định dạng %b
kết hợp với bát phân \033
(tương đương với ASCII ESC
) sẽ hoàn thành công việc. Vui lòng nhận xét nếu có bất kỳ ngoại lệ nào, nhưng AFAIK, tất cả các shell đã triển khai printf
để sử dụng tập hợp con bát phân ASCII ở mức tối thiểu.
Đến tiêu đề của câu hỏi "Sử dụng màu sắc với printf", tính di động nhất cách để thiết lập định dạng là kết hợp các %b
specifier định dạng cho printf
(như tham chiếu trong một sớm câu trả lời từ @Vlad) với một lối thoát bát phân \033
.
portable-color.sh
P="\033["
BLUE=34
printf "-> This is %s %-6s %s text \n" $P"1;"$BLUE"m" "blue" $P"0m"
printf "-> This is %b %-6s %b text \n" $P"1;"$BLUE"m" "blue" $P"0m"
Kết quả đầu ra:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... và 'blue' là màu xanh lam ở dòng thứ hai.
Bộ %-6s
chỉ định định dạng từ OP nằm ở giữa chuỗi định dạng giữa chuỗi ký tự điều khiển mở và đóng.
[1] Tham khảo: man dash
Phần "Nội trang" :: "printf" :: "Định dạng"