Comandos
printf 'ABC$def%hx\n' 10 # output: ABC$defa
printf 'ABC$def%s\n' 10 # output: ABC$def10
funciona como esperado... mas não consigo encontrar nenhuma informação sobre %h.
Ele está disponível em todos os sistemas?
Comandos
printf 'ABC$def%hx\n' 10 # output: ABC$defa
printf 'ABC$def%s\n' 10 # output: ABC$def10
funciona como esperado... mas não consigo encontrar nenhuma informação sobre %h.
Ele está disponível em todos os sistemas?
Você está usando
printf
o comando no shell. Este comando pode ter o modificador de comprimentoh
de formato , quando:se você estiver usando Bash, haverá
printf
um comando embutido no Bash dentro dele."h" está lá há pelo menos 16 anos, Bash 2.02
https://github.com/bminor/bash/blame/master/builtins/printf.def#L187
você está usando
busybox
ash
, então:'h' foi adicionado há 17 anos desde o início do projeto
https://github.com/mirror/busybox/blame/master/coreutils/printf.c#L351
você está usando GNU
coreutils
, então:'h' foi adicionado há 33 anos
https://github.com/coreutils/coreutils/blame/c41ca2814d2ffad5fff9b9526d1be9eb5366d72d/src/printf.c#L635
As informações sobre
h
vêm do padrão C:h
estava lá emprintf
C em 1989 https://port70.net/~nsz/c/c89/c89-draft.html#4.9.6.1h
faz na linguagem de programação C, verifique https://en.cppreference.com/w/c/io/fprintfNo entanto,
h
pode não ser suportado quando:usando o shell do Kernel Dash
printf
embutidoO Ubuntu usa o Dash por padrão
https://web.git.kernel.org/pub/scm/utils/dash/dash.git/tree/src/bltin/printf.c#n263
usando FreeBSD
Não vejo modificador de comprimento mencionado, exceto L para floats
e não vejo isso no código-fonte https://github.com/lattera/freebsd/blob/master/usr.bin/printf/printf.c#L328
e eu testei (nota lateral: o vagrant inicializou com Bash no freebsd de qualquer maneira)
no macOS
/usr/bin/printf
não oferece suporte, o que provavelmente é a mesma versão do BSDe lendo POSIX não vejo modificador de comprimento mencionado:
O que eu digo é que, se trabalhar com Bash, ele estará disponível.
Mas pode não estar disponível no Ubuntu e BSD. Acho que o MacOS tem Bash3 de qualquer maneira.
Curiosidade: qual é a saída do seguinte código
printf "%hjLltzhhhjjjLLLLtttzzzx\n" 10
no Bash?Não há
%h
um especificador de formato único. A letrah
é usada como um modificador do especificador de formato que a segue. Na linguagem de programação C,%hhx
%hx
%x
%llx
%lx
%zx
%jx
todos recebem tipos de argumentos diferentes. Veja a tabela em https://en.cppreference.com/w/c/io/fprintf para explicação. No shell, no entanto, isso não importa, e toda implementação simplesmente ignora esses modificadores.Não,
%h
por si só não é um especificador de formato padrão.printf
,h
é um modificador de comprimento , não um especificador independente. Exemplo:printf
(shell), o comportamento pode variar.%h
sozinho não está documentado, mas algumas implementações podem interpretá-lo inesperadamente