15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
24.10.2024
2 +2

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 directory

Ten ^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 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

Po instalacji sprawdź, czy narzędzie jest dostępne:

dos2unix --version

Wykrywanie 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.txt

Wynik dla pliku w formacie Windows będzie zawierał CRLF line terminators.

Używając cat -A:

cat -A filename.txt

Zakoń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

OpcjaForma długaOpis
-o--oldfileKonwertuj pliki w trybie starym (w miejscu) — domyślne zachowanie
-n--newfileKonwertuj do nowego pliku, zachowując oryginał
-c--convmodeUstaw tryb konwersji: unix, dos lub mac
-k--keep-timestampZachowaj oryginalny znacznik czasu modyfikacji pliku
-q--quietPomiń wszystkie komunikaty wyjściowe i ostrzeżenia
-v--verboseWyświetl szczegółowe informacje o konwersji
-l--newlineDodaj dodatkowy znak nowego wiersza
-s--safeAutomatycznie pomijaj pliki binarne
-f--forceWymuś konwersję plików binarnych
-b--keep-bomZachowaj znacznik kolejności bajtów (BOM), jeśli jest obecny
-r--remove-bomUsuń znacznik kolejności bajtów (BOM)
-V--versionWyświetl numer wersji i zakończ
-h--helpWyś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.txt

Plik 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.txt

To 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.txt

Wszystkie 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 *.txt

Lub 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.txt

7. 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.txt

8. 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.txt

9. 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.txt

10. 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.txt

Uż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.sh

Typowe 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 filename

Skrypt nadal nie działa po konwersji

Sprawdź, czy konwersja zadziałała:

file filename.sh

Powinno 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.conf

dos2unix 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.txt

Używając tr:

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

Używając awk:

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

Używając vim:

:set ff=unix
:wq

Te 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

ZadaniePolecenie
Konwersja pliku w miejscudos2unix filename.txt
Konwersja i zapisanie do nowego plikudos2unix -n input.txt output.txt
Konwersja wielu plikówdos2unix file1.txt file2.txt file3.txt
Rekurencyjna konwersja wszystkich plików .shfind . -name "*.sh" -exec dos2unix {} ;
Zachowanie oryginalnego znacznika czasudos2unix -k filename.txt
Tryb cichy (bez danych wyjściowych)dos2unix -q filename.txt
Usunięcie BOMdos2unix -r filename.txt
Konwersja do formatu Macdos2unix -c mac filename.txt
Odwrotna konwersja: Unix do DOSunix2dos filename.txt
Sprawdzenie zakończeń wierszyfile 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.

15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij