Настройка запуска файлов программы мероприятия в Linux

LinuxBeginner
Практиковаться сейчас

Введение

OPEN CIRCLE готовит дневную художественную программу. Комплект приветствия показывает весь текст, включая Chloé Martín, 林雨, 佐藤葵 и João Silva. Правильный образец работает, а новый экспорт — нет.

Вы исправите отдельную передаваемую копию, сохранив оригиналы. Достаточно базового владения терминалом. Вы различите права, первую строку и кодировку. Программа чтения готова: писать Python или универсальный конвертер не нужно.

Используйте Terminal в браузере. Данные и вывод во всех переводах остаются на исходном языке.

Исправление запуска без изменения оригиналов

На этом шаге вы сравните рабочий комплект с экспортом и подготовите файл для прямого запуска. Используйте Terminal.

Сначала прочитайте настоящий результат

cd меняет рабочий каталог. ./ запускает файл относительно него; косая черта указывает оболочке использовать путь, а не искать имя команды. Начните с готового образца:

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

Прочитайте все строки, включая пустую разделительную. Это текст, действительно декодированный готовой программой, а не изображение или индикатор успеха. cat выводит текст. Перед выбором преобразования прочитайте квитанцию экспорта:

cat source/export-receipt.txt

В квитанции указаны UTF-8 с окончаниями CRLF для start.sh и UTF-16-LE с BOM для programme.txt. Остальные файлы уже имеют UTF-8 и LF. Расширение не определяет кодировку.

Разделите права и вход в интерпретатор

ls -l показывает права; x означает право выполнения. Первая строка скрипта, shebang, начинается с #! и задаёт интерпретатор. Для прямого запуска нужны и правильный вход, и права. Попробуйте экспортированный файл: ошибка здесь ожидаема.

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

Ожидается permission denied. Изменение текста не выдаёт прав. Команда bash file просит Bash прочитать файл, минуя прямой запуск и shebang. В этом конкретном скрипте после команды есть комментарий, поэтому конечный CR попадает в него. Попробуйте:

bash source/start.sh

Ожидаются Cannot read programme.txt и ошибка декодирования UTF-8. Это другой сбой: программа чтения запустилась, но не смогла декодировать данные. Явный вызов Bash даёт полезное свидетельство, но не доказывает готовность прямого запуска.

cp -a копирует содержимое каталога с сохранением режимов файлов. /. означает его содержимое, включая скрытые файлы. Создайте передаваемую копию, не меняя source/ и sample/. mkdir -p создаёт каталог и недостающие родительские каталоги, а при существующем каталоге тоже завершается успешно. chmod u+x добавляет владельцу (u) право выполнения, не меняя остальных прав:

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

Прямой запуск всё ещё завершается ошибкой, например bad interpreter: /bin/bash^M: no such file or directory. Некоторые оболочки сообщают cannot execute: required file not found. Скрипт существует; мешает байт CR в конце пути интерпретатора. Не повторяйте chmod.

Посмотрите байты и исправьте только окончания строк скрипта

LF — байт 0a, CRLF — 0d 0a. file описывает формат по характерным байтам. od -An -tx1 -N16 показывает первые 16 байтов шестнадцатерично, без адресов. Используйте и квитанцию, и байты: file не является безошибочным определителем кодировки.

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

Shebang заканчивается на 0d 0a. Окончания строк и кодировка — разные свойства: скрипт уже в UTF-8. Приложения Linux могут читать CRLF; здесь проблема в пути интерпретатора при прямом запуске.

sed 's/\r$//' удаляет CR только в конце строки. Одинарные кавычки сохраняют выражение; $ означает конец строки. > пишет стандартный вывод в другой файл, заменяя его при повторе. Не перенаправляйте в исходный файл: оболочка очистит его до чтения sed. && запускает следующую команду только после успеха предыдущей. Затем mv переименовывает законченный временный файл:

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

Теперь shebang заканчивается на 0a. Последняя команда достигает Cannot read programme.txt, как явный вызов Bash. Вы дошли до границы данных, но не завершили весь комплект. При ошибке повторите преобразование из source/start.sh и восстановите выполнение; не редактируйте оригинал.

Преобразование программы и независимый запуск

На этом шаге вы декодируете объявленный источник UTF-16, сохраните весь текст и запустите передаваемую копию из другого каталога. Продолжайте в Terminal в /home/labex/project/event.

Используйте свидетельства кодировки

Кодировка связывает символы с байтами. UTF-8 и UTF-16 представляют одинаковые имена разными байтами. BOM в начале UTF-16 задаёт порядок байтов: ff fe — от младшего к старшему, fe ff — от старшего к младшему. Оба варианта — UTF-16. Здесь BOM полезен, а не является безусловно вредным префиксом.

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

Начало ff fe соответствует UTF-16-LE в квитанции. Документированный контракт программы требует UTF-8 без BOM. Она принимает CRLF в тексте, но не может прочитать эти байты UTF-16 как UTF-8. Удаление CR или смена расширения не выполняет декодирование.

iconv -f UTF-16 -t UTF-8 декодирует UTF-16 с BOM и кодирует в UTF-8. -f задаёт источник, -t — назначение; UTF-16 определяет порядок по BOM. Сначала сохраните во временный файл и заменяйте итоговый только после успеха:

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

Начальные байты теперь соответствуют заголовку UTF-8, а не ff fe, fe ff или BOM UTF-8 ef bb bf. Сравните все имена с образцом: удаление не-ASCII символов потеряет смысл, даже если результат декодируется.

При ошибке iconv вывод может быть неполным. && не даст такому файлу заменить итоговый. Проверьте объявленную кодировку и повторите из неизменённого источника; не используйте -c и //IGNORE для молчаливого удаления символов. Урок касается целых данных с известной кодировкой, а не угадывания или ремонта повреждённого экспорта.

Сохраните уже работающие файлы

about.sh и door-sign.txt уже правильные и не нуждаются в преобразовании. cmp сравнивает байты, ничего не выводит и возвращает успех при совпадении. Обе проверки должны быть без вывода:

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

Ожидаются описание общественного искусства и Bienvenue · 欢迎 · ようこそ. Преобразование выбирается по свидетельствам и контракту входа, а не применяется обязательно ко всем файлам.

Передайте и действительно запустите комплект

Скрипт находит reader.py относительно своего положения, программа чтения так же находит programme.txt. Перейдите в посторонний каталог и используйте абсолютный путь. Рабочая передача не должна зависеть от каталога автора или обхода через явный bash:

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

Должны появиться все четыре дневных пункта в исходном порядке с пустой разделительной строкой. Вы использовали настоящие передаваемые файлы. Сравните Chloé Martín, 林雨, 佐藤葵 и João Silva: нулевой код сам по себе не доказывает сохранность текста.

Вернитесь в проект:

cd /home/labex/project/event

Для повтора создайте нужный файл заново из source/. Не передавайте уже преобразованный UTF-8 в iconv -f UTF-16: это неверное объявление источника. Сохраняйте рабочие файлы и повторяйте прямой запуск после изменений. Другие приложения могут принимать другие кодировки или BOM; данные требования относятся к контракту этого комплекта.

Резюме

Вы разделили права прямого запуска, окончания shebang и кодировку данных. Полная программа UTF-8 передана и запущена с сохранением имён, порядка и исправных файлов. Независимая вечерняя задача использует те же методы с другими свидетельствами источника.