Por exemplo, o \c
formato não funciona. Eu sou entrada printf "ABC\ctest"
no console do bash e no resultado;
ABC\ctest
Considerando a \c
propriedade do formato, a saída esperada deve estar na forma de apenas ABC
.
Nem encontrei uma fonte adequada que detalhasse o uso do comando printf no bash. Além disso, como no exemplo acima, as propriedades na página de manual especificadas para o comando printf não funcionam corretamente.
Por favor, mostre-me uma fonte no bash que explica o comando printf em detalhes. Porque estou tão confuso agora.
Você encontrou uma das partes não especificadas do
printf
comando, cujo comportamento varia de implementação para implementação. Você está colocando\c
no lugar errado.Se você ler atentamente a descrição da Single Unix Specification
printf
, verá que\c
não está listado na lista de seqüências de escape definidas para a string de formato (o primeiro argumento do comando). Em vez disso, ele é definido como uma sequência de escape extra que é reconhecida quando fornecida em uma string de argumento que deve ser formatada pelo%b
especificador de formato .Em outras palavras:
printf '%b\n' 'ABC\ctest'
tem um comportamento bem especificado. O\c
faz com que tudo o que resta (incluindo a nova linha na string de formato) seja ignorado.printf '%s\n' 'ABC\ctest'
tem um comportamento bem especificado. O\c
não é uma seqüência de escape em primeiro lugar.printf '\c'
não tem um comportamento bem especificado. O SUS simplesmente silencia sobre o que\c
é, não listando-o como uma sequência de escape, mas também não dizendo em sua seção Notação de Formato de Arquivo que tal sequência nunca é uma sequência de escape.Como diferentes shells se comportam em resposta a essa string de formato não conforme varia bastante. Aqui estão as reações dos shells Debian Almquist, Bourne Again, FreeBSD Almquist, Korn '93 e Z (com
%
s mostrando onde nenhuma nova linha foi emitida):As compilações dos shells MirBSD Korn e PD Korn que eu tenho não possuem um
printf
comando embutido. O FreeBSD não integradoprintf
faz isso:Adicionando à diversão é que o doco para os vários shells às vezes é altamente enganoso e às vezes totalmente errôneo. Por exemplo:
\c
faz, e o lista (através de seu doco forecho
) como uma sequência de escape permitida em strings de formato. (Era incorreto até 2017 , o doco não concordava com o SUS nem descreve o que o Z shell realmente fazia.)\c
está no especificador de formato. Ele também documenta\c
como uma sequência de escape para a string de formato. Seu comportamento é claramente um bug.\c
que corresponde ao SUS e o lista explicitamente em relação a%b
(no caso do shell Bourne Again mais claramente do que agora até 2016 ) e não em uma lista geral de seqüências de escape paraprintf
especificadores de formato. Esses shells não fornecem isso como uma extensão do padrão.printf
, cuja descrição\c
está de acordo com o SUS . Ele a lista explicitamente como uma sequência de escape permitida em strings de formato, e seu comportamento real é conforme documentado no manual do usuário.O shell Almquist do FreeBSD e o (recente) Z shell são os únicos shells, aqui, que ambos documentam permitindo
\c
como uma sequência de escape em strings de formato (uma extensão do que é definido pelo padrão) e realmente se comportam como são documentados.Leitura adicional irônica
É necessário expandir as sequências de escape de barra invertida no argumento correspondente. Como dito aqui :