showkey
não tem nenhum interruptor para isso, mas você sempre pode canalizar a saída para outro programa para fazer a conversão.
Com zsh
você pode fazer assim:
stdbuf -oL showkey -s | while read line
do
if [[ "$line" =~ '^0x' ]]
then
for code in ${(z)line}
do
printf "0%o " $code
done
echo
else
echo $line
fi
done
stdbuf
é parte do GNU coreutils e pode ser usado para modificar operações de buffering nos fluxos padrão. Chamado com -oL
ele ajusta stdout para ser armazenado em buffer de linha. Isso tem que ser feito para que a saída de showkey -s
seja passada imediatamente através do cano linha por linha. Caso contrário, a saída só será passada quando o buffer estiver cheio (geralmente vários kB) ou o programa sair.
A saída é canalizada para um while
-loop, que lê cada linha na variável line
até que o tubo seja fechado. Se line
começar com 0x
(corresponde a regex '^ 0x') cada número hexadecimal ( ${(z)param}
divide uma linha em palavras como o zsh dividiria uma linha de comando) é convertido para octal (na verdade, o número hexadecimal é implicitamente convertido para decimal pelo shell e que formatado como octal por printf
). Se line
não começar com 0x
, imprima como está.
Você também pode usar perl
:
stdbuf -oL showkey -s | perl -e '
while(<STDIN>){
if(/^0x/){
printf "0%o ", hex($_) for split;
print $/;
} else {
print
}
}'
O mesmo princípio se aplica.