Polecenie Linux `dos2unix`: Usuwanie ukrytych znaków Windows z plików
Podczas przesyłania plików tekstowych między systemami Windows i Linux, niewidoczne znaki formatowania mogą po cichu uszkadzać skrypty, pliki konfiguracyjne i potoki danych. Główną przyczyną jest fundamentalna różnica w sposobie, w jaki każdy system operacyjny oznacza koniec wiersza: Windows używa sekwencji powrotu karetki + wysuwu wiersza (rn, znana również jako CRLF), podczas gdy Linux oczekuje tylko wysuwu wiersza (n, czyli LF). Ten dodatkowy znak r — niewidoczny w większości edytorów — może powodować niepowodzenie skryptów powłoki z tajemniczymi błędami, przerywać parsery konfiguracji i generować nieoczekiwane wyniki w narzędziach do przetwarzania tekstu, takich jak awk, sed i grep.
Narzędzie dos2unix zostało stworzone specjalnie w celu rozwiązania tego problemu. Usuwa zakończenia wierszy w stylu Windows CRLF z plików tekstowych i zastępuje je zakończeniami w stylu Unix LF, dzięki czemu pliki są w pełni kompatybilne z narzędziami Linux. Ten przewodnik obejmuje wszystko, co musisz wiedzieć: co dos2unix robi pod maską, jak zainstalować go w głównych dystrybucjach Linux, jego pełną składnię i opcje oraz praktyczne przykłady z życia wzięte.
Czym jest dos2unix i dlaczego ma znaczenie?
dos2unix to lekkie, otwartoźródłowe narzędzie wiersza poleceń, które konwertuje pliki tekstowe z formatu DOS/Windows (zakończenia wierszy CRLF) do formatu Unix/Linux (zakończenia wierszy LF). Może również wykonywać odwrotną konwersję (unix2dos), obsługiwać klasyczne zakończenia wierszy Mac (tylko CR) i przetwarzać operacje na plikach bezpieczne dla danych binarnych.
Dlaczego ukryte znaki r powodują realne problemy
Rozważmy skrypt Bash stworzony lub edytowany na komputerze z systemem Windows. Po uruchomieniu go w systemie Linux możesz zobaczyć błędy takie jak:
bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directoryTen ^M jest wizualną reprezentacją r. Powłoka nie może znaleźć interpretera, ponieważ linia shebang zawiera ukryty znak powrotu karetki. Podobnie skrypty Python, zadania cron, pliki .env oraz pliki konfiguracyjne Nginx lub Apache mogą zachowywać się nieprzewidywalnie, gdy zawierają zakończenia wierszy Windows.
Jest to szczególnie istotne w środowiskach serwerowych. Jeśli zarządzasz środowiskiem Hostingu VPS lub Serwerem Dedykowanym, wdrożenie błędnie skonfigurowanych skryptów lub uszkodzonych plików konfiguracyjnych może spowodować awarię usług. Wiedza o tym, jak wykrywać i naprawiać problemy z zakończeniami wierszy, jest podstawową umiejętnością administratora systemu.
Jak zainstalować dos2unix w systemie Linux
Większość głównych dystrybucji Linux zawiera dos2unix w domyślnych repozytoriach pakietów. Użyj odpowiedniego polecenia dla swojej dystrybucji:
Debian / Ubuntu
sudo apt-get update && sudo apt-get install dos2unixCentOS / RHEL / AlmaLinux / Rocky Linux
sudo yum install dos2unixFedora
sudo dnf install dos2unixArch Linux
sudo pacman -S dos2unixopenSUSE
sudo zypper install dos2unixPo instalacji sprawdź, czy narzędzie jest dostępne:
dos2unix --versionWykrywanie zakończeń wierszy Windows przed konwersją
Przed uruchomieniem dos2unix dobrą praktyką jest potwierdzenie, że plik rzeczywiście zawiera zakończenia wierszy CRLF. Kilka metod sprawdza się dobrze:
Używając file:
file filename.txtWynik dla pliku w formacie Windows będzie zawierał CRLF line terminators.
Używając cat -A:
cat -A filename.txtZakończenia wierszy Windows pojawiają się jako ^M$ na końcu każdego wiersza. Zakończenia wierszy Unix pokazują tylko $.
Używając hexdump:
hexdump -C filename.txt | grep -i "0d 0a"Sekwencja bajtów 0d 0a jest szesnastkową reprezentacją rn.
Pełna składnia polecenia dos2unix
dos2unix [options] [input_file] [output_file]Gdy wywołany tylko z plikiem wejściowym, dos2unix konwertuje plik w miejscu, nadpisując oryginał. Gdy podany jest zarówno plik wejściowy, jak i wyjściowy, oryginał jest zachowany, a przekonwertowana zawartość jest zapisywana do nowego pliku.
Informacje o opcjach dos2unix
| Opcja | Forma długa | Opis |
|---|---|---|
-o | --oldfile | Konwertuj pliki w trybie starym (w miejscu) — domyślne zachowanie |
-n | --newfile | Konwertuj do nowego pliku, zachowując oryginał |
-c | --convmode | Ustaw tryb konwersji: unix, dos lub mac |
-k | --keep-timestamp | Zachowaj oryginalny znacznik czasu modyfikacji pliku |
-q | --quiet | Pomiń wszystkie komunikaty wyjściowe i ostrzeżenia |
-v | --verbose | Wyświetl szczegółowe informacje o konwersji |
-l | --newline | Dodaj dodatkowy znak nowego wiersza |
-s | --safe | Automatycznie pomijaj pliki binarne |
-f | --force | Wymuś konwersję plików binarnych |
-b | --keep-bom | Zachowaj znacznik kolejności bajtów (BOM), jeśli jest obecny |
-r | --remove-bom | Usuń znacznik kolejności bajtów (BOM) |
-V | --version | Wyświetl numer wersji i zakończ |
-h | --help | Wyświetl informacje pomocy |
Praktyczne przykłady użycia dos2unix
1. Konwersja pojedynczego pliku w miejscu
Najczęstszy przypadek użycia — konwersja pliku i nadpisanie go wersją w formacie Unix:
dos2unix filename.txtPlik jest modyfikowany bezpośrednio. Domyślnie nie jest tworzona kopia zapasowa, więc upewnij się, że masz kopię, jeśli jest potrzebna.
2. Konwersja pliku i zapisanie do nowego pliku
Aby zachować oryginalny plik i zapisać przekonwertowane dane wyjściowe do oddzielnego pliku, użyj flagi -n (tryb nowego pliku):
dos2unix -n filename.txt converted_filename.txtTo odczytuje filename.txt, konwertuje go i zapisuje wynik do converted_filename.txt. Oryginał pozostaje nienaruszony.
3. Konwersja wielu plików jednocześnie
Możesz podać wiele nazw plików w jednym poleceniu:
dos2unix file1.txt file2.txt file3.txtWszystkie wymienione pliki są konwertowane w miejscu. Jest to wydajne w przypadku operacji wsadowych na małym zestawie znanych plików.
4. Konwersja wszystkich plików .txt w katalogu
Użyj globowania powłoki lub find do przetwarzania całych katalogów:
dos2unix *.txtLub rekurencyjnie przez podkatalogi:
find /path/to/directory -type f -name "*.txt" -exec dos2unix {} ;Jest to szczególnie przydatne podczas wdrażania plików aplikacji internetowych lub zestawów konfiguracyjnych, które zostały spakowane na komputerze z systemem Windows.
5. Rekurencyjna konwersja wszystkich skryptów powłoki
Częste zadanie administratora systemu — naprawienie wszystkich skryptów Bash w katalogu projektu:
find /var/www/myapp -type f -name "*.sh" -exec dos2unix {} ;6. Zachowanie oryginalnego znacznika czasu pliku
Domyślnie dos2unix aktualizuje czas modyfikacji pliku. Aby zachować oryginalny znacznik czasu (przydatne w potokach wdrożeniowych lub gdy make opiera się na znacznikach czasu):
dos2unix -k filename.txt7. Tryb cichy — pomijanie wszystkich danych wyjściowych
Idealny do użycia w skryptach powłoki i automatyzacji, gdzie nie chcesz, aby komunikaty o konwersji zaśmiecały logi:
dos2unix -q filename.txt8. Konwersja do zakończeń wierszy Mac (tylko CR)
Choć rzadko potrzebne dzisiaj, możesz przekonwertować plik do klasycznego formatu Mac OS 9 (tylko powrót karetki, r) używając flagi trybu konwersji -c:
dos2unix -c mac filename.txt9. Konwersja z formatu Unix z powrotem do formatu DOS
dos2unix jest dostarczany razem z unix2dos, który wykonuje odwrotną operację — dodaje zakończenia CRLF dla kompatybilności z Windows:
unix2dos filename.txt10. Usuwanie znacznika kolejności bajtów (BOM)
Pliki zapisane przez aplikacje Windows czasami zawierają UTF-8 BOM na początku, co może przerywać działanie skryptów i parserów w systemie Linux. Usuń go za pomocą:
dos2unix -r filename.txtUżywanie dos2unix w skryptach powłoki i automatyzacji
dos2unix integruje się płynnie ze skryptami wdrożeniowymi i potokami CI/CD. Oto przykład skryptu przed wdrożeniem, który oczyszcza wszystkie pliki konfiguracyjne i skryptowe przed ich uruchomieniem:
#!/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."Nadaj skryptowi uprawnienia do wykonywania i uruchom go jako część przepływu pracy wdrożeniowego:
chmod +x pre-deploy-sanitize.sh
./pre-deploy-sanitize.shTypowe błędy i rozwiązywanie problemów
dos2unix: command not found
Narzędzie nie jest zainstalowane. Uruchom odpowiednie polecenie instalacyjne dla swojej dystrybucji (patrz sekcja instalacji powyżej).
dos2unix: Binary file ... is skipped
dos2unix wykrył to, co uważa za plik binarny i pominął go. Jeśli masz pewność, że plik jest tekstowy, wymuś konwersję za pomocą:
dos2unix -f filenameSkrypt nadal nie działa po konwersji
Sprawdź, czy konwersja zadziałała:
file filename.shPowinno teraz raportować ASCII text lub UTF-8 Unicode text bez wzmianki o CRLF. Jeśli problemy nadal występują, sprawdź inne problemy z kodowaniem używając hexdump.
Odmowa dostępu
Możesz potrzebować podwyższonych uprawnień do modyfikowania niektórych plików systemowych:
sudo dos2unix /etc/nginx/nginx.confdos2unix a metody alternatywne
Chociaż dos2unix jest najczystszym rozwiązaniem, doświadczeni administratorzy Linux czasami używają innych narzędzi do szybkich jednorazowych konwersji:
Używając sed:
sed -i 's/r//' filename.txtUżywając tr:
tr -d 'r' < input.txt > output.txtUżywając awk:
awk '{ sub("r$", ""); print }' filename.txt > output.txtUżywając vim:
:set ff=unix
:wqTe alternatywy działają, ale dos2unix jest stworzony specjalnie do tego zadania, obsługuje przypadki brzegowe (takie jak usuwanie BOM i wykrywanie plików binarnych) bardziej elegancko i jest zalecanym narzędziem do użytku produkcyjnego.
Znaczenie dla hostingu internetowego i zarządzania serwerem
Problemy z zakończeniami wierszy to nie tylko niedogodność dla programistów — są one prawdziwym problemem operacyjnym w środowiskach hostingowych. Skrypty PHP z zakończeniami CRLF mogą generować nieoczekiwane białe znaki w nagłówkach HTTP, powodując awarie sesji i plików cookie. Aplikacje Python WSGI mogą zgłaszać błędy składni. Pliki konfiguracyjne Nginx i Apache z ukrytymi znakami r mogą całkowicie uniemożliwić uruchomienie usług.
Jeśli hostujesz strony internetowe lub aplikacje na planie Współdzielonego Hostingu Internetowego lub zarządzasz własnym VPS z cPanel, włączenie dos2unix do przepływu pracy przesyłania i wdrażania plików jest prostą, wartościową praktyką. Dla zespołów prowadzących automatyczne wdrożenia na Serwerach Dedykowanych, dodanie dos2unix do potoku CI/CD eliminuje całą klasę błędów specyficznych dla środowiska, zanim dotrą do produkcji.
Ponadto, jeśli Twoja infrastruktura obejmuje Hosting Poczty E-mail z niestandardowymi skryptami do przetwarzania lub filtrowania poczty, zapewnienie, że te skrypty używają poprawnych zakończeń wierszy Unix, jest niezbędne dla niezawodnego działania.
Skrócone podsumowanie
| Zadanie | Polecenie |
|---|---|
| Konwersja pliku w miejscu | dos2unix filename.txt |
| Konwersja i zapisanie do nowego pliku | dos2unix -n input.txt output.txt |
| Konwersja wielu plików | dos2unix file1.txt file2.txt file3.txt |
Rekurencyjna konwersja wszystkich plików .sh | find . -name "*.sh" -exec dos2unix {} ; |
| Zachowanie oryginalnego znacznika czasu | dos2unix -k filename.txt |
| Tryb cichy (bez danych wyjściowych) | dos2unix -q filename.txt |
| Usunięcie BOM | dos2unix -r filename.txt |
| Konwersja do formatu Mac | dos2unix -c mac filename.txt |
| Odwrotna konwersja: Unix do DOS | unix2dos filename.txt |
| Sprawdzenie zakończeń wierszy | file filename.txt lub cat -A filename.txt |
Podsumowanie
Polecenie dos2unix to małe narzędzie o ogromnym wpływie na wieloplatformowe tworzenie oprogramowania i administrację serwerami. Ukryte znaki r są jedną z najczęstszych przyczyn błędów „działa na moim komputerze”, gdy pliki przemieszczają się między środowiskami Windows i Linux — a dos2unix eliminuje je czysto, bezpiecznie i wydajnie.
Opanowując jego składnię i opcje, możesz zapobiegać awariom wdrożeń, zapewniać kompatybilność skryptów i utrzymywać integralność plików konfiguracyjnych w całej infrastrukturze. Niezależnie od tego, czy jesteś programistą przesyłającym kod na serwer Linux, administratorem systemu zarządzającym flotą maszyn, czy właścicielem witryny przesyłającym pliki do środowiska hostingowego, włączenie dos2unix do standardowego zestawu narzędzi jest prostą najlepszą praktyką, która przynosi korzyści za każdym razem, gdy pliki przekraczają granice systemów operacyjnych.
