15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
24.10.2024
1 +1

Linux команда `dos2unix`: Видалення прихованих символів Windows з файлів

Коли ви переносите текстові файли між системами Windows і Linux, невидимі символи форматування можуть непомітно пошкодити ваші скрипти, конфігураційні файли та конвеєри обробки даних. Першопричина полягає у фундаментальній різниці в тому, як кожна операційна система позначає кінець рядка: Windows використовує послідовність повернення каретки + переведення рядка (rn, також відому як CRLF), тоді як Linux очікує лише переведення рядка (n, або LF). Цей зайвий символ r — невидимий у більшості редакторів — може спричиняти збої shell-скриптів із незрозумілими помилками, порушувати роботу парсерів конфігурацій і призводити до неочікуваних результатів у інструментах обробки тексту, таких як awk, sed і grep.

Утиліта dos2unix була створена саме для вирішення цієї проблеми. Вона видаляє закінчення рядків у стилі Windows CRLF з текстових файлів і замінює їх закінченнями рядків у стилі Unix LF, роблячи ваші файли повністю сумісними з інструментами Linux. Цей посібник охоплює все, що вам потрібно знати: що dos2unix робить під капотом, як встановити її на основних дистрибутивах Linux, повний синтаксис і параметри, а також практичні реальні приклади.

Що таке dos2unix і чому це важливо?

dos2unix — це легка утиліта командного рядка з відкритим вихідним кодом, яка конвертує текстові файли з формату DOS/Windows (закінчення рядків CRLF) у формат Unix/Linux (закінчення рядків LF). Вона також може виконувати зворотне перетворення (unix2dos), обробляти класичні закінчення рядків Mac (лише CR) і виконувати операції з файлами, безпечні для бінарних даних.

Чому приховані символи r спричиняють реальні проблеми

Розгляньмо Bash-скрипт, створений або відредагований на машині з Windows. Коли ви запускаєте його на Linux, ви можете побачити такі помилки:

bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directory

^M — це візуальне представлення r. Shell не може знайти інтерпретатор, оскільки рядок shebang містить прихований символ повернення каретки. Так само Python-скрипти, завдання cron, файли .env, а також конфігураційні файли Nginx або Apache можуть поводитися непередбачувано, якщо вони містять закінчення рядків Windows.

Це особливо критично в серверних середовищах. Якщо ви керуєте середовищем VPS Хостингу або Виділеним Сервером, розгортання неправильно налаштованих скриптів або пошкоджених конфігураційних файлів може призвести до збою сервісів. Вміння виявляти та виправляти проблеми з закінченнями рядків є фундаментальною навичкою системного адміністратора.

Як встановити dos2unix на Linux

Більшість основних дистрибутивів Linux включають dos2unix у свої стандартні репозиторії пакетів. Використовуйте відповідну команду для вашого дистрибутива:

Debian / Ubuntu

sudo apt-get update && sudo apt-get install dos2unix

CentOS / RHEL / AlmaLinux / Rocky Linux

sudo yum install dos2unix

Fedora

sudo dnf install dos2unix

Arch Linux

sudo pacman -S dos2unix

openSUSE

sudo zypper install dos2unix

Після встановлення перевірте його доступність:

dos2unix --version

Виявлення закінчень рядків Windows перед конвертацією

Перед запуском dos2unix рекомендується переконатися, що файл дійсно містить закінчення рядків CRLF. Кілька методів добре підходять для цього:

Використання file:

file filename.txt

Вивід для файлу у форматі Windows міститиме CRLF line terminators.

Використання cat -A:

cat -A filename.txt

Закінчення рядків Windows відображаються як ^M$ в кінці кожного рядка. Закінчення рядків Unix показують лише $.

Використання hexdump:

hexdump -C filename.txt | grep -i "0d 0a"

Байтова послідовність 0d 0a є шістнадцятковим представленням rn.

Повний синтаксис команди dos2unix

dos2unix [options] [input_file] [output_file]

При виклику лише з вхідним файлом dos2unix конвертує файл на місці, перезаписуючи оригінал. Коли вказано як вхідний, так і вихідний файл, оригінал зберігається, а конвертований вміст записується до нового файлу.

Довідник параметрів dos2unix

ПараметрПовна формаОпис
-o--oldfileКонвертувати файли у старому режимі (на місці) — поведінка за замовчуванням
-n--newfileКонвертувати до нового файлу, зберігаючи оригінал
-c--convmodeВстановити режим конвертації: unix, dos або mac
-k--keep-timestampЗберегти мітку часу модифікації оригінального файлу
-q--quietПридушити всі повідомлення та попередження
-v--verboseВиводити детальну інформацію про конвертацію
-l--newlineДодати додатковий символ нового рядка
-s--safeАвтоматично пропускати бінарні файли
-f--forceПримусово конвертувати бінарні файли
-b--keep-bomЗберегти мітку порядку байтів (BOM), якщо вона присутня
-r--remove-bomВидалити мітку порядку байтів (BOM)
-V--versionВідобразити номер версії та вийти
-h--helpВідобразити довідкову інформацію

Практичні приклади використання dos2unix

1. Конвертація одного файлу на місці

Найпоширеніший випадок використання — конвертація файлу з перезаписом його версією у форматі Unix:

dos2unix filename.txt

Файл змінюється безпосередньо. За замовчуванням резервна копія не створюється, тому за потреби переконайтеся, що у вас є копія.

2. Конвертація файлу із збереженням до нового файлу

Щоб зберегти оригінальний файл і записати конвертований вивід до окремого файлу, використовуйте прапорець -n (режим нового файлу):

dos2unix -n filename.txt converted_filename.txt

Це зчитує filename.txt, конвертує його та записує результат до converted_filename.txt. Оригінал залишається незміненим.

3. Конвертація кількох файлів одночасно

Ви можете передати кілька імен файлів в одній команді:

dos2unix file1.txt file2.txt file3.txt

Усі перелічені файли конвертуються на місці. Це ефективно для пакетних операцій з невеликим набором відомих файлів.

4. Конвертація всіх файлів .txt у директорії

Використовуйте підстановочні знаки shell або find для обробки цілих директорій:

dos2unix *.txt

Або рекурсивно по піддиректоріях:

find /path/to/directory -type f -name "*.txt" -exec dos2unix {} ;

Це особливо корисно при розгортанні файлів веб-застосунків або наборів конфігурацій, які були упаковані на машині з Windows.

5. Рекурсивна конвертація всіх shell-скриптів

Типове завдання системного адміністратора — виправити всі Bash-скрипти в директорії проекту:

find /var/www/myapp -type f -name "*.sh" -exec dos2unix {} ;

6. Збереження оригінальної мітки часу файлу

За замовчуванням dos2unix оновлює час модифікації файлу. Щоб зберегти оригінальну мітку часу (корисно в конвеєрах розгортання або коли make покладається на мітки часу):

dos2unix -k filename.txt

7. Тихий режим — придушення всього виводу

Ідеально підходить для використання в shell-скриптах та автоматизації, де ви не хочете, щоб повідомлення про конвертацію захаращували журнали:

dos2unix -q filename.txt

8. Конвертація до закінчень рядків Mac (лише CR)

Хоча сьогодні це рідко потрібно, ви можете конвертувати файл у класичний формат Mac OS 9 (лише повернення каретки, r), використовуючи прапорець режиму конвертації -c:

dos2unix -c mac filename.txt

9. Конвертація з Unix назад у формат DOS

dos2unix постачається разом із unix2dos, який виконує зворотну операцію — додає закінчення CRLF для сумісності з Windows:

unix2dos filename.txt

10. Видалення мітки порядку байтів (BOM)

Файли, збережені застосунками Windows, іноді містять UTF-8 BOM на початку, що може порушувати роботу скриптів і парсерів на Linux. Видаліть її за допомогою:

dos2unix -r filename.txt

Використання dos2unix у shell-скриптах та автоматизації

dos2unix легко інтегрується в скрипти розгортання та конвеєри CI/CD. Ось приклад скрипту попереднього розгортання, який очищає всі конфігураційні файли та скрипти перед їх введенням у дію:

#!/bin/bash
# pre-deploy-sanitize.sh
# Converts all text files to Unix format before deployment

TARGET_DIR="/var/www/myapp"

echo "Sanitizing line endings in $TARGET_DIR..."

find "$TARGET_DIR" -type f ( -name "*.sh" -o -name "*.conf" -o -name "*.php" -o -name "*.py" ) | while read -r file; do
    dos2unix -q -k "$file"
    echo "Converted: $file"
done

echo "Done. All files converted to Unix format."

Зробіть скрипт виконуваним і запустіть його як частину вашого робочого процесу розгортання:

chmod +x pre-deploy-sanitize.sh
./pre-deploy-sanitize.sh

Поширені помилки та усунення несправностей

dos2unix: command not found

Утиліта не встановлена. Виконайте відповідну команду встановлення для вашого дистрибутива (див. розділ встановлення вище).

dos2unix: Binary file ... is skipped

dos2unix виявив, що, на його думку, є бінарним файлом, і пропустив його. Якщо ви впевнені, що файл є текстовим, примусово виконайте конвертацію за допомогою:

dos2unix -f filename

Скрипт все ще не працює після конвертації

Перевірте, чи конвертація спрацювала:

file filename.sh

Тепер має відображатися ASCII text або UTF-8 Unicode text без згадки про CRLF. Якщо проблеми зберігаються, перевірте наявність інших проблем з кодуванням за допомогою hexdump.

Відмовлено у доступі

Для зміни певних системних файлів вам можуть знадобитися підвищені привілеї:

sudo dos2unix /etc/nginx/nginx.conf

dos2unix проти альтернативних методів

Хоча dos2unix є найчистішим рішенням, досвідчені адміністратори Linux іноді використовують інші інструменти для швидких одноразових конвертацій:

Використання sed:

sed -i 's/r//' filename.txt

Використання tr:

tr -d 'r' < input.txt > output.txt

Використання awk:

awk '{ sub("r$", ""); print }' filename.txt > output.txt

Використання vim:

:set ff=unix
:wq

Ці альтернативи працюють, але dos2unix створений спеціально для цього завдання, більш коректно обробляє граничні випадки (наприклад, видалення BOM та виявлення бінарних файлів) і є рекомендованим інструментом для використання у виробничому середовищі.

Актуальність для веб-хостингу та управління серверами

Проблеми з закінченнями рядків — це не просто незручність для розробників, а справжня операційна проблема в хостингових середовищах. PHP-скрипти із закінченнями CRLF можуть створювати неочікувані пробіли в HTTP-заголовках, спричиняючи збої сесій і файлів cookie. Python WSGI-застосунки можуть видавати синтаксичні помилки. Конфігураційні файли Nginx та Apache із прихованими символами r можуть повністю перешкоджати запуску сервісів.

Якщо ви розміщуєте веб-сайти або застосунки на тарифі Спільного Веб-хостингу або керуєте власним VPS з cPanel, включення dos2unix у ваш робочий процес завантаження та розгортання файлів є простою практикою з високою цінністю. Для команд, які виконують автоматизовані розгортання на Виділених Серверах, додавання dos2unix до вашого конвеєра CI/CD усуває цілий клас помилок, специфічних для середовища, ще до того, як вони потраплять у виробництво.

Крім того, якщо ваша інфраструктура включає Поштовий Хостинг з користувацькими скриптами для обробки або фільтрації пошти, забезпечення правильних закінчень рядків Unix у цих скриптах є необхідним для надійної роботи.

Короткий довідник

ЗавданняКоманда
Конвертувати файл на місціdos2unix filename.txt
Конвертувати та зберегти до нового файлуdos2unix -n input.txt output.txt
Конвертувати кілька файлівdos2unix file1.txt file2.txt file3.txt
Рекурсивно конвертувати всі файли .shfind . -name "*.sh" -exec dos2unix {} ;
Зберегти оригінальну мітку часуdos2unix -k filename.txt
Тихий режим (без виводу)dos2unix -q filename.txt
Видалити BOMdos2unix -r filename.txt
Конвертувати у формат Macdos2unix -c mac filename.txt
Зворотне: Unix у DOSunix2dos filename.txt
Перевірити закінчення рядківfile filename.txt або cat -A filename.txt

Висновок

Команда dos2unix — це невелика утиліта з непропорційно великим впливом у кросплатформній розробці та адмініструванні серверів. Приховані символи r є однією з найпоширеніших причин помилок «працює на моїй машині», коли файли переміщуються між середовищами Windows і Linux — і dos2unix усуває їх чисто, безпечно та ефективно.

Опанувавши її синтаксис і параметри, ви зможете запобігти збоям розгортання, забезпечити сумісність скриптів і підтримувати цілісність конфігураційних файлів у всій вашій інфраструктурі. Незалежно від того, чи ви розробник, який надсилає код на Linux-сервер, системний адміністратор, який керує парком машин, чи власник сайту, який завантажує файли в хостингове середовище, включення dos2unix до вашого стандартного набору інструментів є простою найкращою практикою, яка приносить дивіденди щоразу, коли файли перетинають межі операційних систем.

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати