message_offset
bashスクリプトのステータスを印刷するbashスクリプト機能があります。
つまり、次のようにメッセージとステータスを渡して呼び出すことができます。
message_offset "install font library" "[ OK ]"
常に80列幅の一番右の文字を設定するために使用される形式printf
で端末に印刷されます。たとえば、出力は次のようになります。%*s
[ OK ]
install font library [ OK ]
update configuration file on server [ ERR ]
^
|
always
at 80
以下を使用すると、echo
出力は次のようになります。
install font library [ OK ]
update configuration file on server [ ERR ]
パスワード:
#!/usr/bin/env bash
function message_offset() {
local message="$1"
local status="$2"
# compensate for the message length by reducing the offset
# by the length of the message,
(( offset = 80 - ${#message} ))
# add a $(tput sgr0) to the end to "exit attributes" whether a color was
# set or not
printf "%s%*s%s" "${message}" 80 "$status" "$(tput sgr0)"
}
tput
を使用して文字列にいくつかのカラーシーケンスを追加しようとするまで、これはすべてうまくいきます。これにより「[ERR]」が赤色に変わります。フォーマットはオフセットを設定するときにtput文字の順序を計算する
ようですので、printf "%*s"
関数を呼び出すと
message_offset "update configuration file on server" "$(tput setaf 1)[ ERR ]"
出力は次のようになります。
install font library [ OK ]
update configuration file on server [ ERR ]
この文字列にはすべての文字と文字がprintf "%*s"
含まれていますが、明らかに文字は印刷されないため、実際にはパディングには影響しません。 「ステータス」メッセージに色を追加し、スタイルの色順を使用する方法はありますか?"[ ERR ]"
"$(tput setaf 1)
"$(tput setaf 1)
tput
ベストアンサー1
必要以上に複雑にしています。$message
ANSIシーケンスの幅を考慮せずにソートを処理できます。
#! /usr/bin/env bash
message() {
[ x"$2" = xOK ] && color=2 || color=1
let offset=$(tput cols)-4-${#2}
printf "%-*s[ %s%s%s ]\n" $offset "$1" "$(tput setaf "$color")" "$2" "$(tput sgr0)"
}
message "install font library" "OK"
message "update configuration file on server" "ERR"
編集する:ほとんどのprintf(1)
実装では、マルチバイト文字セットの長さの計算を正しく処理できません。したがって、UTF-8形式のアクセント文字を含むメッセージを印刷するには、他のアプローチを取る必要があるかもしれません。肩をすくめる