man printf.1
altta 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 . dash
taşı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
\033
ESC
printf
"Printf ile renkleri kullanma" sorusunun başlığına göre, biçimlendirmeyi ayarlamanın en taşınabilir yolu, %b
biç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 %-6s
biçim belirleyicisi, açma ve kapama kontrol karakter dizileri arasındaki biçim dizesinin ortasındadır.
[1] Ref: man dash
Bö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.