Tuesday, 8 August 2017

Linux Printf Format Binário Opções


O comando printf Stranger, este é um tópico muito grande que precisa de experiência - por favor preencha as informações que faltam, estenda as descrições e corrija os detalhes se puder. Atenção: Trata-se do comando print - mas a descrição deve ser Quase idêntico para um comando externo que segue POSIX. GNU Awk espera uma vírgula após a string de formato e entre cada um dos argumentos de um comando printf. Para obter exemplos, consulte: snippet de código. Ao contrário de outras documentações, eu não quero redirecioná-lo para a página de manual para a família de funções printf () C. No entanto, se you039re mais experientes, que deve ser a descrição mais detalhada para o formato seqüências de caracteres e modificadores. Devido a implementações históricas conflitantes do comando echo, o POSIX recomenda que o printf seja preferido ao echo. O comando printf fornece um método para imprimir texto pré-formatado semelhante à interface do sistema printf () (função C). It039s significou como sucessor de eco e tem muito mais recursos e possibilidades. Além de outras razões, POSIX tem um argumento muito bom para recomendá-lo: Ambos os principais sabores históricos do comando echo são exclusivos mútuos, eles colidem. Um comando quotnewquot tinha que ser inventado para resolver o problema. O formato de texto é fornecido em ltFORMATgt. Enquanto todos os argumentos que o formatstring pode apontar são dados depois disso, aqui, indicado por ltARGUMENTSgt. Assim, um típico printf - call se parece com: onde quotSome: snName: snquot é a especificação de formato, e as duas variáveis ​​são passadas como argumentos, o s nos formatostring aponta para (para cada especificador de formato que você dá, printf aguarda um argumento) . Se for dada, a saída é atribuída à variável VAR em vez de impressa para stdout (comparável a sprintf () de alguma forma). A opção - v não pode atribuir diretamente aos índices de array em versões anteriores ao Bash 4.1. Nas versões mais recentes do que 4.1, deve-se ter cuidado ao executar expansões no primeiro argumento não-opção do printf, pois isso abre a possibilidade de uma vulnerabilidade de injeção de código fácil. Onde o eco pode, obviamente, ser substituído por qualquer comando arbitrário. Se for necessário, especifique uma string de formato codificado ou use - para assinalar o fim das opções. O mesmo problema exato também se aplica a leitura. E um semelhante ao mapfile. Embora realizar expansões em seus argumentos é menos comum. É claro que no shell, o que significa que os argumentos são apenas seqüências de caracteres, no entanto, as notações comuns C mais algumas adições para as constantes de número são reconhecidos para dar um argumento de número para printf. Basically, é um problema de portabilidade (e confiabilidade). Inicialmente, echo didnt aceitar qualquer opção e não expandir nada. Tudo o que estava fazendo era produzir seus argumentos separados por um caractere de espaço e terminados por um caractere de nova linha. Agora, alguém pensou que seria bom se pudéssemos fazer coisas como echo nt para produzir caracteres de nova linha ou tabulação, ou ter uma opção para não produzir o caractere de nova linha. Eles então pensaram mais, mas em vez de adicionar essa funcionalidade ao shell (como perl, onde dentro de aspas duplas, t realmente significa um caractere de tabulação), eles adicionaram ao echo. David Korn percebeu o erro e introduziu uma nova forma de shell quotes:. Que mais tarde foi copiado por bash e zsh, mas já era tarde demais naquela época. Agora, quando um eco Unix padrão recebe um argumento que contém os dois caracteres e t. Em vez de output-los, ele produz um caractere de tabulação. E assim que ele vê c em um argumento, ele pára a saída (assim, a nova linha de saída também não é exibida). Outras versões de vendedores do shellsUnix optaram por fazê-lo de maneira diferente: eles adicionaram uma opção - e para expandir seqüências de escape e uma opção - n para não exibir a nova linha de saída. Alguns têm um - E para desativar seqüências de escape, alguns têm-n, mas não - e. A lista de sequências de escape suportadas por uma implementação de eco não é necessariamente a mesma que é suportada por outra. Naquelas implementações de eco que suportam opções, geralmente não há suporte de um - para marcar o fim de opções (zsh e possivelmente outros apoio - para que embora), por isso, por exemplo, é difícil de saída - n com eco em muitos shells. Em alguns shells como bash 1 ou ksh93 2 ou yash (variável ECHOSTYLE), o comportamento depende mesmo de como o shell foi compilado ou o ambiente (o comportamento do eco GNU também mudará se POSIXLYCORRECT estiver no ambiente). Assim, dois bash eco, mesmo a partir da mesma versão do bash não são garantidos para se comportar o mesmo. POSIX diz: se o primeiro argumento for - n ou qualquer argumento contiver barras invertidas, o comportamento não será especificado. Bash eco nesse sentido não é POSIX em que, por exemplo, eco - e não é saída - eltnewlinegt POSIX como exige. A especificação do Unix é mais rigorosa, ela proíbe - n e requer a expansão de algumas seqüências de escape incluindo o c para interromper a saída. Essas especificações realmente não vêm para o resgate aqui dado que muitas implementações não são compatíveis. Tudo somado, você não sabe o que echo var irá produzir, a menos que você possa ter certeza de que var doesnt conter caracteres de barra invertida e não começar com -. A especificação POSIX realmente nos diz para usar o printf nesse caso. Então o que isso significa é que você não pode usar o eco para exibir dados não controlados. Em outras palavras, se você está escrevendo um script e está tomando entrada externa (do usuário como argumentos, ou nomes de arquivos do sistema de arquivos.), Você não pode usar o eco para exibi-lo. (Embora funcione corretamente com algumas implementações de eco como o bash quando a opção xpgecho não tiver sido habilitada de uma forma ou outra como no tempo de compilação ou pelo ambiente). Printf. Por outro lado é mais confiável, pelo menos quando se limita ao uso básico de eco. Produzirá o conteúdo de var seguido de um caractere de nova linha, independentemente do caractere que ele possa conter. Sairá sem o caractere de nova linha. Agora, também há diferenças entre as implementações printf. Há um núcleo de recursos que é especificado pelo POSIX, mas, em seguida, há um monte de extensões. Por exemplo, alguns suportam um q para citar os argumentos, mas como o seu feito varia de shell para shell, alguns suportam uxxxx para caracteres unicode. O comportamento varia para printf 10sn var em locais multi-byte, há pelo menos três resultados diferentes para printf b 123 Mas no final, se você ficar com o conjunto de recursos POSIX de printf e não tente fazer nada muito extravagante com ele, você está longe de problemas. Mas lembre-se que o primeiro argumento é o formato, portanto não deve conter dados variableuncontrolled. Um eco mais confiável pode ser implementado usando printf. Como: O subshell (que implica gerar um processo extra na maioria das implementações do shell) pode ser evitado usando IFS local com muitos shells, ou escrevendo-o como: 1. como o comportamento de eco do bash pode ser alterado. Com o bash. Em tempo de execução, existem duas coisas que controlam o comportamento ou o eco (ao lado de ativar - n eco ou redefinir o eco como uma função ou alias): a opção bash xpgecho e se bash está no modo posix. O modo posix pode ser habilitado se bash for chamado como sh ou se POSIXLYCORRECT estiver no ambiente ou com a opção posix: Comportamento padrão na maioria dos sistemas: xpgecho expande sequências como Unix requer: Ele ainda honra - n e - e (e - E ): Com xpgecho e modo POSIX: Desta vez, bash é POSIX e Unix conformant. Note que no modo POSIX, bash ainda não está em conformidade com POSIX, uma vez que não produz saída - e em: Os valores padrão para xpgecho e posix podem ser definidos em tempo de compilação com --enable-xpg-echo-default e --enable-strict - posix-default opções para o script de configuração. Isso é tipicamente o que as versões recentes do OSX fazer para construir seu binsh. Nenhum UnixLinux implementationdistribution em sua mente direita seria tipicamente fazer isso para binbash embora. 2. Como o comportamento do eco do ksh93 s pode ser alterado. Em ksh93. Se echo expande seqüências de escape ou não e reconhece opções depende do conteúdo de PATH. Se PATH contiver um componente que contém 5bin ou xpg antes do bin ou usrbin componente, então ele se comportar a maneira SysVUnix (expande seqüências, não aceita opções). Se ele localizar ucb ou bsd primeiro, então ele comporta o modo BSD 3 (-e para ativar a expansão, reconhece - n). O padrão é dependente do sistema, BSD no Debian: 3. BSD para echo - e A referência ao BSD para o tratamento da opção - e é enganosa aqui. Todos esses comportamentos de eco diferentes e incompatíveis foram todos introduzidos nos laboratórios Bell: n. 0ooo em Programmers Work Bench UNIX (baseado em Unix V6), eo resto (b. C.) No Unix System III Ref. - n em Unix V7 (por Denis Ritchie Ref) - e em Unix V8 (por Denis Ritchie Ref) BSDs apenas desceu do Unix V7. O eco do FreeBSD ainda não suporta - e. Embora ele suporte - n como Unix V7 fez. Uma vantagem, se você quiser chamá-lo assim, seria que você não tem que dizer isso como eco para interpretar certas seqüências de escape como n. Ele sabe para interpretá-los e não vai exigir um - e para fazê-lo. (Nota: o último n é necessário, echo implica, a menos que você dê a opção - n) Observe o último n em printf. No final do dia é uma questão de gosto e exigências o que você usa: eco ou printf. Uma desvantagem do printf é o desempenho porque o eco do shell embutido é muito mais rápido. Isso entra em ação especialmente no Cygwin, onde cada instância de um novo comando causa sobrecarga pesada do Windows. Quando eu mudei meu programa eco-pesado de usar binecho para o eco de conchas o desempenho quase dobrou. É um trade off entre portabilidade e desempenho. Não é um slam dunk para usar sempre printf. Respondido Oct 3 14 às 17: 00Linux e comando Unix printf A string FORMAT contém três tipos de objetos: caracteres comuns. Que são copiados literalmente para a saída. Interpretadas sequências de caracteres, que são escapados com uma barra invertida (). Especificações de conversão, que definem a maneira pela qual os ARGUMENTOS serão expressos como parte da saída. Aqui está um exemplo rápido que usa esses três tipos de objetos: Este comando produz a saída: Aqui, FORMAT é colocado entre aspas (). Existe uma especificação de conversão: s. Que interpreta o argumento John como uma string e insere-o na saída. Há três seqüências de caracteres de escape: duas ocorrências de e uma ocorrência de n. A seqüência se traduz como uma citação dupla literal é escapada com uma barra invertida para que printf sabe tratá-lo como um caractere literal, e não como o fim da seqüência de caracteres FORMAT. N é a seqüência para um caractere de nova linha, e diz printf para começar uma nova linha e continuar a saída de lá. A potência do printf reside no fato de que para qualquer string FORMAT, o ARGUMENT s pode ser alterado para afetar a saída. Por exemplo, a saída do comando no exemplo acima pode ser alterada apenas mudando o argumento, John. Se usado em um script. Esse argumento pode ser definido como uma variável. Por exemplo, o comando irá inserir o valor da variável de ambiente LOGNAME. Que é o nome de usuário de quem executou o comando. Especificações de conversão Cada especificação de conversão começa com a e termina com um caractere de conversão. Entre o e o caráter de conversão pode haver, em ordem: Um sinal de menos. Isso informa printf para a esquerda - ajuste a conversão do argumento. Um inteiro que especifica largura de campo printf imprimirá uma conversão de ARGUMENT em um campo com pelo menos número de caracteres de largura. Se necessário, será preenchido à esquerda (ou à direita, se for necessário o ajuste à esquerda) para compensar a largura do campo. Um período, que separa a largura do campo da precisão. Um número inteiro, a precisão, que especifica o número máximo de caracteres a serem impressos a partir de uma seqüência de caracteres, ou o número de dígitos após o ponto decimal de um valor de ponto flutuante ou o número mínimo de dígitos para um inteiro. Estes diferenciam entre um inteiro curto e um longo, respectivamente, e são geralmente necessários somente para a programação de computador. Os caracteres de conversão propriamente ditos, que indicam ao printf que tipo de argumento esperar, são os seguintes: Note que printf requer o número de seqüências de conversão para coincidir com o número de ARGUMENT que os mapeia um-para-um, e espera encontrar exatamente Um ARGUMENT para cada seqüência de conversão. A única exceção é uma seqüência de conversão que usa um asterisco tais strings requerem dois argumentos cada. As cadeias de conversão são sempre interpretadas da esquerda para a direita. Por exemplo, o seguinte comando printf: produz a seguinte saída: Interpreted Escaped Character Sequences As seguintes sequências de caracteres são interpretadas como caracteres especiais por printf: imprime uma citação dupla () imprime uma barra invertida () emite um alerta Imprime um byte com valor octal NNN (1 a 3 dígitos) imprime um byte com valor hexadecinal HH (1 a 2 Dígitos) imprime o caractere unicode com valor hexadecimal HHHH (4 dígitos) imprime o caractere unicode com valor hexadecimal HHHHHHHH (8 dígitos) imprime ARGUMENT como uma string com escapes interpretados como listados acima, com a exceção de que octal escapes tomar a forma 0 ou 0 NN Quoting In The Shell Tenha cuidado com a forma como o seu shell interpreta cadeias entre aspas. Se o shell não estiver interpretando corretamente a seqüência de caracteres citada, tente usar aspas simples em vez de aspas duplas. Printf exemplos Imprime a seguinte saída: Imprime a mesma saída do exemplo acima. Imprime uma seqüência de caracteres indicando a localização do diretório inicial. Comandos relacionados awk mdash Interpretador para a linguagem de programação de processamento de texto AWK. Bc mdash Uma calculadora. Echo mdash Texto de saída.

No comments:

Post a Comment