AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 778575
Accepted
Vlastimil Burián
Vlastimil Burián
Asked: 2024-06-19 06:21:59 +0800 CST2024-06-19 06:21:59 +0800 CST 2024-06-19 06:21:59 +0800 CST

Caracteres UTF-8 no script de shell POSIX *comentários* - algo contra isso?

  • 772

Gostaria de incluir alguns caracteres não ASCII em meus comentários de script de shell POSIX . Observe que isso não é de forma alguma uma duplicata de, por exemplo, "Quais codificações de caracteres são suportadas pelo posix?" já que me importo apenas com a seção de comentários. Portanto, não me importo se posso usar Unicode para codificação real. Eu me importo se todos os shells compatíveis com POSIX serão capazes de ler meu arquivo ou se alguns falharem devido à codificação não ASCII.

Portanto, meu editor (VS Code) salvará esse arquivo com codificação UTF-8.

Aqui estão dois arquivos identificados com o fileutilitário (não tenho certeza se ele se importa com o BOM):

$ file script1*
script1:     POSIX shell script, ASCII text executable
script1.utf: POSIX shell script, Unicode text, UTF-8 text executable

A questão é: se os scripts shell POSIX devem estar apenas em ASCII. Não consigo encontrar nada relevante sobre este tópico. Obrigado.

shell-script
  • 3 3 respostas
  • 949 Views

3 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2024-06-19T16:22:25+08:002024-06-19T16:22:25+08:00

    POSIX especifica como os tokens devem ser reconhecidos , incluindo comentários:

    Se o caractere atual for um '#', ele e todos os caracteres subsequentes até, mas excluindo, a próxima <nova linha> deverão ser descartados como um comentário. A <nova linha> que finaliza a linha não é considerada parte do comentário.

    Você está perguntando especificamente sobre o UTF-8; O UTF-8 garante que as novas linhas sejam codificadas conforme esperado em ASCII e que apenas as novas linhas produzam o valor de byte correspondente. Portanto, nenhuma codificação de caracteres UTF-8 não ASCII pode ser mal interpretada como uma nova linha, o que significa que UTF-8 é seguro para uso em comentários em shells compatíveis com POSIX.

    Sua pergunta menciona BOMs de passagem; eles não são necessários em UTF-8 e os arquivos que começam com uma BOM não são compatíveis com versões anteriores de ASCII. Um script de shell que começa com uma BOM não é compatível com POSIX e não se comportará conforme o esperado:

    $ printf '\xEF\xBB\xBFecho Hello\n' > bomtest
    $ file bomtest
    bomtest: POSIX shell script, Unicode text, UTF-8 (with BOM) text executable
    $ sh bomtest
    bomtest: line 1: echo: command not found
    

    O BOM é considerado parte do primeiro token, então o shell procura um comando correspondente a “BOM echo” e não encontra nenhum.

    • 17
  2. AnoE
    2024-06-19T19:03:22+08:002024-06-19T19:03:22+08:00

    A resposta aceita é boa, mas deixe-me explicar a mesma com um ângulo ligeiramente diferente:

    POSIX é muito exato e completo no tratamento de codificações de caracteres. Ou seja, qualquer efeito concebível de codificações de caracteres não triviais é mencionado nas páginas relevantes. Conforme mostrado nesta resposta , basicamente faz um requisito mínimo sobre quais caracteres existem, mas não diz nada realmente limitante sobre a codificação desses caracteres. Ele define o que acontece em certos casos difíceis (por exemplo, codificação inválida em certas circunstâncias; ocorrências do byte NUL especial; a exigência de que uma certa quantidade mínima de caracteres esteja contida no conjunto de caracteres e assim por diante). A parte relevante do padrão é POSIX Character Set .

    Observe que, na esmagadora maioria dos lugares, o POSIX fala sobre caracteres e não sobre bytes . Na verdade, se você procurar por "byte" em POSIX Shell Command Language , qualquer menção a "byte" estará sempre no contexto de onde a codificação pode ter dado errado ou onde os limites de RAM estão envolvidos (ou seja, comprimentos máximos de caminho) e assim continuamente, ou o que deve acontecer caso o usuário altere a codificação definindo as variáveis ​​de ambiente relevantes dentro de um shell. Em todas as descrições "normais" (ou seja, de comandos shell), fala sobre caracteres, e apenas caracteres.

    Especificamente, o caractere de comentário é definido assim:

    Se o caractere atual for um '#', ele e todos os caracteres subsequentes até, mas excluindo, a próxima nova linha serão descartados como um comentário. A nova linha que finaliza a linha não é considerada parte do comentário.

    Na especificação do conjunto de caracteres vinculada acima, encontramos:

    Os valores codificados associados aos membros do conjunto de caracteres portáteis são representados, cada um, em um único byte.

    (O #ou <number-sign>faz parte do Conjunto de Caracteres Portáteis).

    Este último é interessante. O UTF-8, sobre o qual você está perguntando, contém ASCII de 7 bits como um subconjunto verdadeiro na definição e codificação de caracteres, portanto, a postulação é cumprida. UTF-16 seria difícil neste caso e, portanto (e por muitas outras razões) UTF-16 não é compatível com POSIX .

    Para sua pergunta atual: todos os usos bem formados de UTF-8 estão corretos após o comentário. O comentário (sinal numérico) e a nova linha são completamente bem definidos e seguros em UTF-8; não por coincidência, o UTF-8 também garante que os caracteres codificados em mais de um byte não contenham bytes ASCII de 7 bits, portanto, não pode haver um sinal de número involuntário ou caractere de nova linha em uma codificação UTF-8 aleatória .

    Todas as coisas que não são fáceis de especificar são especificadas especificamente como "não especificadas" pelo POSIX. Então, o que acontece se o seu script contiver codificações inválidas é, bem, indefinido. Por exemplo, se no final do comentário, antes da nova linha, o último caractere for uma codificação multibyte, e a nova linha vier no meio disso -> não especificado. Espere que erros e todos os tipos de hilaridade aconteçam.

    Dito isto, um comando bem comportado não (precisará) se preocupar com esses casos, tratando basicamente tudo como bytes e se preocupando apenas com bytes específicos de 7 bits (ou seja, caracteres de controle).

    Ou , se o comando suportar UTF-8, os métodos usuais de recuperação definidos em UTF-8 para detectar e tratar codificações inválidas deverão ser aplicados. Especificamente de acordo com RFC 3629 - UTF-8 :

    As implementações do algoritmo de decodificação acima DEVEM proteger contra a decodificação de sequências inválidas.

    Mas o POSIX não diz nada sobre isso, no contexto desta questão.

    • 7
  3. vonbrand
    2024-06-19T23:50:08+08:002024-06-19T23:50:08+08:00

    Se você está preocupado com shells realmente compatíveis com POSIX, as respostas acima são adequadas. Mas o Real World™ não é compatível com POSIX. Você encontrará shells que lidam com Latin-1, ou UTF-8, ou outras codificações exóticas sem problemas. E (mais provavelmente em sistemas mais antigos, limitados ou apenas parecidos com Unix) você também encontrará aqueles que se ajustam se a entrada não for estritamente ASCII.

    Princípio de Postel: “Seja conservador no que envia, seja liberal no que aceita”. Aqui você é o remetente.

    • -1

relate perguntas

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Um script que imprime as linhas de um arquivo com seu comprimento [fechado]

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Dividir por delimitador e concatenar problema de string

  • MySQL Select com função IN () com array bash

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve