Em resumo, printf %100s
imprimirá 100 espaços e tr " " "="
os converterá em sinais de igual, efetivamente imprimindo 100 sinais de igual.
Dividindo:
printf
é um shell embutido. Normalmente, são necessários dois ou mais argumentos, o primeiro dos quais é uma "sequência de formato" e o restante será usado para preencher espaços reservados nessa sequência de formato. Quando esse modelo estiver totalmente preenchido, ele imprimirá o resultado. Se houver mais argumentos, ele será iniciado novamente, preenchendo mais argumentos e imprimindo a sequência resultante.
A string de formato usada para obter printf
especificações de formato, que começam %
e terminam com uma única letra, %d
significa um número inteiro (usando a base decimal, portanto "d"), %f
significa um número de ponto flutuante e %s
uma string de caracteres. Caracteres que não sejam letras após %
são modificadores para a especificação de formato e, em particular, números são usados para especificar o comprimento solicitado do campo na saída. Assim %100s
, formatará a string para ter pelo menos 100 caracteres, preenchê-la-á com espaços e mantê-la alinhada corretamente (em outras palavras, adicione espaços no início da string).
Se passado um argumento extra, ele seria usado para esse %s
campo, por exemplo printf %100s abc
, imprimirá 97 espaços (para chegar ao total de 100, considerando os 3 em "abc") seguidos pela sequência real "abc". Mas se nenhum argumento for fornecido, a especificação de formato será preenchida com um argumento vazio ou nulo (que é uma string vazia para %s
, seria 0 para %d
etc.). Isso é o mesmo que se uma string vazia fosse passada, como printf %100s ''
. O resultado final é que apenas o preenchimento de 100 caracteres é impresso.
Então, juntando tudo, printf %100s
resulta em 100 espaços impressos.
Agora tr
é uma ferramenta para converter caracteres da entrada para a saída. Ele usa dois argumentos, SET1 e SET2, cada um conjunto de caracteres e, em seguida, converte o primeiro caractere de SET1 no primeiro de SET2, o segundo caractere de SET1 no segundo de SET2 e assim por diante. tr
lê sua entrada de stdin e a grava de volta em stdout (por isso é muito útil em pipelines como o acima.) tr
sempre traduzirá todas as ocorrências desse caractere em uma determinada string.
Por exemplo, tr aeiou 12345
converterá vogais em minúsculas nos números de 1 a 5 nessa ordem, portanto converterá "enfileiramento" em "q52523ng", por exemplo. Você também pode passar intervalos de caracteres, como tr a-z A-Z
transformar qualquer letra minúscula na maiúscula correspondente.
Assim, tr " " "="
é simplesmente traduzir espaços em sinais de igual em toda a cadeia. O primeiro espaço precisa ser citado para ser reconhecido como um argumento. Na =
verdade, não precisa ser citado, mas isso não faz mal. tr " " =
teria funcionado da mesma maneira.
Juntando tudo, imprima 100 espaços e depois traduza cada um deles em sinais de igual.
Espero que isso explique com detalhes suficientes, mas se ainda houver algo que você não entende, deixe um comentário e tentarei abordar isso.
printf '%100s' ' ' | tr " " "="