¿Hay alguna forma de anotar la codificación de bash en su shebang?

CorePress2024-01-24  9

Escribí un bash como el siguiente y se reproduce muy bien en la terminal de Linux, ya que codifiqué el archivo con UTF-8:

#!/bin/bash
echo 'Olá, möndo!'

Debo permitir que los usuarios elijan la codificación que consideren adecuada, sin dejar de imprimir los signos diacríticos correctos en el terminal, pero como el terminal tiene por defecto UTF-8, cualquier otra codificación produce todo tipo de caracteres extraños.

Entonces, el problema es: ¿Cómo se supone que los usuarios deben anotar la codificación de bash en el archivo? ¿Tiene bash un patrón que nos permita hacerlo?

Soy consciente de que file -I detecta la codificación de un archivo casi correctamente, pero los bashes en cuestión se ejecutan de la forma habitual ./foo.sh. Por lo tanto, sería bueno si el terminal pudiera detectar la codificación por sí mismo.

Funciona al revés. Su secuencia de comandos conoce la codificación del terminal desde la configuración regional, por lo que debería generar texto que esté en esa codificación. No es el terminal el que detecta su secuencia de comandos, sino que ésta proporciona traducciones para diferentes codificaciones.

- KamilCuk

26/03/2021 a las 19:03

Creo que la pregunta que debe hacerse primero es: cuando el usuario especifica la codificación, qué programa convertirá la salida a la codificación de salida correcta (y, de hecho, ¿cómo sabrá ese programa cuál es la codificación de salida correcta? ?) Encuentre una respuesta a eso, y la forma de incorporarla en el guión puede responderse por sí sola.

- IMSoP

26/03/2021 a las 19:03

Lo entiendo. A veces simplemente no puedo lograr que cambien la configuración de sus aplicaciones, pero puedo alentarlos a que al menos lo hagan.Primero escriba la codificación en el archivo.

- Codificador Guga

26/03/2021 a las 19:10



------------------------------------

Funciona al revés. Su secuencia de comandos conoce la codificación que el usuario quiere tener en sus mensajes desde la configuración regional LC_MESSAGES, por lo que su secuencia de comandos debería generar texto que esté en esa codificación. No es que el terminal detecte su secuencia de comandos, sino que su secuencia de comandos proporciona traducciones de sus mensajes para diferentes codificaciones. LC_MESSAGES también debe tener información de codificación, por lo que LC_MESSAGES=en_US.UTF-8 no es LC_MESSAGESen_US.EBCDIC.

La forma habitual de proporcionar traducciones es a través de gettext. Bash viene con soporte integrado para gettext (bpero todavía necesita mucho trabajo para que sea utilizable) con su función $"..." compatibilidad con cadenas, consulte las traducciones locales.

Respondido

26 de marzo de 2021 a las 19:10

KamilCuk

KamilCuk

127k

8

8 insignias de oro

63

63 insignias de plata

117

117 insignias de bronce

6

Esto resuelve completamente el problema.problema: #!/usr/bin/env LC_ALL=en_US.ISO-8859-1 bash Y los usuarios generalmente conocen la codificación en la que escriben. Estoy dispuesto a seguir eso. ¿Ves alguna razón por la que no debería hacerlo?

- Codificador Guga

26/03/2021 a las 19:22

3

@GugaCoder Eso no lo resolverá, porque la codificación que el terminal espera/entiende puede ser diferente de la codificación del script, y eso no hace nada para traducir entre ellos. PeroEs incluso peor que eso, porque la codificación utilizada para los nombres de archivos puede ser algo diferente de la del script y/o del terminal, y si necesita interactuar con contenido de texto dentro de los archivos, eso puede volver a ser diferente... y cada vez que el texto de uno de estos contextos se mueve a un contexto diferente, es posible que necesites un paso de traducción explícito.

- Gordon Davisson

26/03/2021 a las 20:10

Veo la implicación. Edito mi pregunta para reflejar tu pensamiento. Sin embargo, parece funcionar, así que voy a investigar más a fondo para saber qué sucede.

- Codificador Guga

26/03/2021 a las 20:35

Tienes razón, veo que suceden todo tipo de cosas extrañas.

- Codificador Guga

26/03/2021 a las 20:51

1

Como alternativa, puedes pedirle a la gente que agregue un comentario en formato estandarizado como segunda línea del script (por ejemplo, #Charset: ISO-8859-1) y luego escribir un script convertidor que lea ese comentario.nt y traduce el script a tu juego de caracteres preferido (y también ajusta el comentario para que coincida).

- Gordon Davisson

27 de marzo de 2021 a las 3:23



------------------------------------

Para una solución más sencilla, puede utilizar iconv para realizar conversiones sobre la marcha. Suponiendo que puede extraer la codificación preferida del usuario desde su configuración regional en $enc, entonces simplemente

echo 'Olá, möndo!' | iconv -f utf-8 -t "$enc"

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare