man printf.1altta bir not vardır: "... kabuğunuzun kendi sürümü olabilir printf...". Bu soru için etiketlendi bash, ancak mümkünse herhangi bir kabuğa taşınabilir komut dosyaları yazmaya çalışıyorum . dashtaşınabilirlik için iyi bir asgari taban çizgisi genellikle - cevap burada çalışır böylece bash, dash&zsh . Bir betik bu 3'te çalışıyorsa, büyük olasılıkla hemen hemen her yere taşınabilir.
[1] 'printf deki en son uygulama, ANSI kaçış karakterine sahip bir biçim belirticisi verildiğinde çıktıyı renklendirmez - ancak sekizlik (ASCII'ye eşdeğer) ile birleştirilmiş bir biçim belirticisi işi bitirir. Lütfen aykırı değerler için yorum yapın, ancak AFAIK, tüm mermiler ASCII sekizlik alt kümesini minimumda kullanmak için uygulanmıştır .dash%s\e%b\033ESCprintf
"Printf ile renkleri kullanma" sorusunun başlığına göre, biçimlendirmeyi ayarlamanın en taşınabilir yolu, %bbiçim belirticisini printf( @Vlad'dan daha önceki bir yanıtta belirtildiği gibi ) sekizlik kaçış ile birleştirmektir \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"
Çıktılar:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... ve 'mavi' ikinci satırda mavidir.
OP'deki %-6sbiçim belirleyicisi, açma ve kapama kontrol karakter dizileri arasındaki biçim dizesinin ortasındadır.
[1] Ref: man dashBölüm "Yerleşikler" :: "printf" :: "Biçim"
printf, bir biçim dizesi ve biçime göre yazdırılan bir bağımsız değişken listesinden oluşur. Renkleri biçim dizesinin bir parçası olarak görmelisiniz ve bu nedenle, biçim dizesine ait olmalıdırlar.