Hacer funcionar correctamente el kit de bienvenida

LinuxBeginner
Practicar Ahora

Introducción

OPEN CIRCLE prepara una tarde de artes comunitarias. El kit muestra el programa completo, con Chloé Martín, 林雨, 佐藤葵 y João Silva. El ejemplo correcto funciona; la copia recién exportada no.

Repararás una entrega separada preservando los originales. Basta familiaridad básica con la terminal. Aprenderás por qué permisos, primera línea y codificación son cuestiones distintas. El lector está preparado; no escribirás Python ni un conversor general.

Usa Terminal en el navegador. Los datos y la salida conservan su idioma original en todas las traducciones.

Reparar el lanzador sin cambiar los originales

En este paso compararás un kit funcional con una exportación y crearás un lanzador ejecutable directamente. Usa Terminal.

Leer primero el resultado real

cd cambia el directorio de trabajo. ./ ejecuta un archivo relativo a ese directorio; la barra indica al shell que use esa ruta en vez de buscar nombres de comandos. Empieza con el ejemplo incluido:

cd /home/labex/project/event
./sample/start.sh
OPEN CIRCLE | Afternoon

14:00 — Welcome / Chloé Martín
14:30 — 纸艺工坊 / 林雨
15:15 — 音の庭 / 佐藤葵
16:00 — Café & questions / João Silva

Lee todas las líneas, incluida la separación en blanco. Son los bytes realmente decodificados por el lector, no una captura ni una etiqueta de éxito. cat imprime texto. Lee el recibo de exportación antes de elegir la conversión:

cat source/export-receipt.txt

El recibo declara UTF-8 con finales CRLF para start.sh y UTF-16-LE con BOM para programme.txt. Los demás archivos ya son UTF-8 con LF. Una extensión no determina la codificación.

Distinguir permisos y entrada al intérprete

ls -l muestra los permisos; x indica permiso de ejecución. La primera línea de un script, el shebang, comienza por #! y nombra al intérprete. La ejecución directa necesita tanto una entrada válida como permiso. Prueba el lanzador exportado; este fallo es intencional:

ls -l source/start.sh
./source/start.sh

Espera permission denied. Cambiar el texto no concede permisos. bash file pide a Bash que lea el archivo, evitando la ejecución directa y su shebang. Este script concreto incluye un comentario tras el comando, por lo que el CR final queda dentro del comentario. Pruébalo:

bash source/start.sh

Espera Cannot read programme.txt y un error de decodificación UTF-8. Es otro fallo: se alcanzó el lector, pero no pudo decodificar los datos. La llamada explícita a Bash aporta evidencia; no demuestra que la ejecución directa esté lista.

cp -a copia el contenido de un directorio y conserva los modos de los archivos. /. significa su contenido, incluidos los archivos ocultos. Crea una copia de entrega sin cambiar source/ ni sample/. mkdir -p crea el directorio y los padres que falten; también funciona si ya existe. chmod u+x añade ejecución para el propietario (u) sin cambiar los otros permisos:

mkdir -p delivery
cp -a source/. delivery/
chmod u+x delivery/start.sh
./delivery/start.sh

La ejecución directa sigue fallando con un error como bad interpreter: /bin/bash^M: no such file or directory. Algunos shells muestran cannot execute: required file not found. El script existe; el problema es el byte CR al final de la ruta del intérprete. No sigas repitiendo chmod.

Examinar bytes y corregir solo los finales del script

LF es el byte 0a; CRLF es 0d 0a. file describe el formato según patrones de bytes. od -An -tx1 -N16 muestra los primeros 16 bytes en hexadecimal, sin etiquetas de dirección. Combina recibo y bytes; file no es un detector infalible:

file source/start.sh source/programme.txt
od -An -tx1 -N16 source/start.sh

El shebang termina en 0d 0a. Los finales de línea y la codificación son propiedades distintas: el script ya es UTF-8. Linux puede leer texto CRLF; este fallo afecta a la ruta del intérprete de un script ejecutado directamente.

sed 's/\r$//' elimina únicamente un CR situado al final de una línea. Las comillas simples preservan la expresión; $ significa fin de línea. > guarda la salida estándar en otro archivo y lo reemplaza al reintentar. Nunca redirijas sobre la entrada: el shell la vaciaría antes de que sed la leyera. && ejecuta el siguiente comando solo si el anterior tuvo éxito. mv renombra después el archivo temporal completo:

sed 's/\r$//' source/start.sh > delivery/start.tmp && mv delivery/start.tmp delivery/start.sh
chmod u+x delivery/start.sh
od -An -tx1 -N16 delivery/start.sh
./delivery/start.sh

El shebang ahora termina en 0a. El último comando llega a Cannot read programme.txt, como la llamada explícita a Bash. Has llegado al límite de los datos, pero el kit aún no está terminado. Si te equivocas, repite desde source/start.sh y restaura el permiso de ejecución; no edites el original.

Convertir el programa y usar la entrega independiente

En este paso decodificarás el origen UTF-16 declarado, conservarás todo el texto y ejecutarás la entrega desde otro directorio. Continúa en Terminal, en /home/labex/project/event.

Usar la evidencia de codificación

Una codificación relaciona caracteres con bytes. UTF-8 y UTF-16 representan los mismos nombres mediante bytes distintos. Un BOM al inicio de UTF-16 registra el orden de bytes: ff fe indica little endian; fe ff, big endian. Ambos son UTF-16. Aquí el BOM es evidencia útil, no un prefijo siempre perjudicial.

od -An -tx1 -N16 source/programme.txt

El inicio ff fe coincide con UTF-16-LE en el recibo. El contrato del lector exige UTF-8 sin BOM. Acepta CRLF en datos de texto, pero no puede decodificar estos bytes UTF-16 como UTF-8. Eliminar CR o cambiar la extensión no realiza esa decodificación.

iconv -f UTF-16 -t UTF-8 decodifica UTF-16 con BOM y lo codifica como UTF-8. -f indica el formato de origen y -t el destino; UTF-16 usa el BOM para elegir el orden. Guarda primero en un archivo temporal y úsalo como definitivo solo si hay éxito:

iconv -f UTF-16 -t UTF-8 source/programme.txt > delivery/programme.tmp && mv delivery/programme.tmp delivery/programme.txt
file delivery/programme.txt
od -An -tx1 -N16 delivery/programme.txt
cat delivery/programme.txt

Los primeros bytes ahora son los del título en UTF-8, no ff fe, fe ff ni el BOM UTF-8 ef bb bf. Compara cada nombre con el ejemplo: eliminar caracteres no ASCII perdería contenido aunque el archivo pudiera decodificarse.

Si iconv informa de un error, su salida puede estar incompleta. && impide promover ese archivo parcial. Comprueba el origen declarado y repite desde el archivo intacto; no uses -c ni //IGNORE para descartar caracteres silenciosamente. Esta lección trata codificaciones declaradas e intactas, no adivinar ni reparar exportaciones corruptas.

Conservar lo que ya funciona

about.sh y door-sign.txt ya eran correctos; no necesitan conversión. cmp compara bytes: no imprime nada y devuelve éxito si son iguales. Ambas comparaciones deben ser silenciosas:

cmp source/about.sh delivery/about.sh
cmp source/door-sign.txt delivery/door-sign.txt
./delivery/about.sh
cat delivery/door-sign.txt

Espera la descripción de artes comunitarias y Bienvenue · 欢迎 · ようこそ. La conversión responde a evidencia y a un contrato de entrada; no es obligatoria para todos los archivos.

Entregar y ejecutar realmente el kit

El lanzador busca reader.py respecto a su propia ubicación; el lector hace lo mismo con programme.txt. Cambia a un directorio ajeno y usa la ruta absoluta del lanzador. La entrega no debe depender del directorio del autor ni de invocar bash como atajo:

cd /tmp
/home/labex/project/event/delivery/start.sh

Espera las cuatro entradas completas de la tarde mostradas antes, en el mismo orden y con la separación en blanco. Has usado los archivos entregados. Compara Chloé Martín, 林雨, 佐藤葵 y João Silva; un estado de salida cero no demuestra por sí solo que el texto sobrevivió.

Vuelve al proyecto:

cd /home/labex/project/event

Para reintentar, regenera el archivo afectado desde source/. No pases la salida UTF-8 ya convertida a iconv -f UTF-16: declararía mal el origen. Conserva los archivos funcionales y repite el lanzamiento directo tras cualquier cambio. Otras aplicaciones pueden admitir otras codificaciones o BOM; estos requisitos pertenecen al contrato de este kit.

Resumen

Separaste permisos de ejecución, finales del shebang y codificación de datos. Entregaste y ejecutaste el programa UTF-8 completo conservando nombres, orden y archivos correctos. El reto independiente de la tarde usa los mismos métodos con otra evidencia de origen.