Użyłem Cygwina na moim laptopie (DOS). Mam kolekcję skryptów od moich kolegów i własną. Nie jestem informatykiem, nie znam się na Uniksie. Śledzę składnię moich kolegów i potrafię zarządzać kilkoma prostymi rzeczami.
Skrypty działały dobrze na moim starym laptopie. Właśnie zmieniłem laptopa, zainstalowałem Cygwin. Kiedy uruchamiam skrypty, one nie działają. Oto jeden przykład komunikatu o błędzie, który otrzymuję:
line 1: $':\r': command not found
line 5: syntax error near unexpected token `$'\r''
line 5: `fi
Oto 5 pierwszych linii mojego skryptu
:
iter=1
if [ -f iter.txt ]
then rm ./iter.txt
fi
Czy ktoś może wyjaśnić, jak mogę obejść ten problem?
źródło
vim
można to zrobić na dwa sposoby, z których jeden używa słów. Lub jeszcze lepiej, aby wskazać, gdzie na to podrzędne zadanie zostało w kółko udzielone, o wiele bardziej szczegółowe niż jakakolwiek odpowiedź na tej stronie, w tym unix.stackexchange.com/questions/88811 tylko na początek.vi -b
i tak\r
są rozszerzeniami vima. nie POSIX, nie w nvi, elvis, Solaris vi ...Wynika to z zapisania skryptu przez edytor korzystający z końcówek linii DOS (na przykład Notepad ++). Będziesz musiał usunąć je ze swoich skryptów.
Aby to zrobić, użyj albo
dos2unix
w pliku skryptu, albo(spowoduje to usunięcie wszystkich zwrotów karetki z dowolnego miejsca w skrypcie)
Jeśli chodzi o kod w skrypcie:
Powinno to wyglądać mniej więcej tak
Spowoduje to usunięcie pliku
1.txt
z bieżącego katalogu, jeśli istnieje.:
Polecenie nie robi nic (prawie) i mogą być usunięte. Wartośćiter
zmiennej powinna być używana jako$iter
i cytowana. A potem jestem prawdopodobnie bardziej wyraźny, niż trzeba,./
mówiąc, że plik należy znaleźć w bieżącym katalogu.Jeśli masz zamiar przekształcić pętli (tutaj, usuwając wszystkie pliki
1.txt
,2.txt
...,10.txt
):Lub jeśli czujemy się podstępni / leniwi,
w powłokach, które rozumieją rozwinięcie nawiasu klamrowego.
źródło
Windows (CR LF)
i zmienić naUnix (LF)
rm -f [1-9].txt 10.txt
. Ale to nie jest całkowicie logicznie równoważne, jakby nie istnieją żadne pliki, 1-9, ale nie jest to plik o nazwie dosłownie[1-9].txt
następnie zostanie ona usunięta. : DTwoje skrypty mają niewłaściwe zakończenia linii. Windows używa CR + LF (\ r \ n), Unix używa LF (\ n), a Classic MacOS używa CR (\ r). Musisz zmienić zakończenia wszystkich plików, których dotyczy problem, za pomocą edytora tekstu lub samodzielnego narzędzia, takiego jak
dos2unix
.Systemy FTP i kontroli wersji, takie jak SVN, zwykle potrafią odpowiednio konwertować zakończenia linii, więc możesz zajrzeć do tych opcji przesyłania plików w przyszłości.
Jeśli te pliki nie są przesyłane, ale są po prostu używane na jednym komputerze, będziesz chciał znaleźć ustawienia zakończeń linii w preferowanym edytorze tekstu. Większość reklamowanych jako „dla programistów” będzie miała taką opcję.
źródło
Jako dodatkową odpowiedź pozwól mi dodać kilka notatek / wskazówek ...
Po pierwsze, w przypadku zwykłych plików tekstowych można łatwo ustalić, czy mają one końcówkę linii uniksowej czy DOS za pomocą
file
polecenia. Na przykład:Zwróć uwagę na moje użycie
dos2unix
. Bardzo polecam go zainstalować. W zależności od tego, jak korzystasz z Cygwin, może być konieczne wykonywanie tej konwersji wystarczająco często, aby wygoda była mile widziana. Co ważniejsze, nie ma szans na błąd, jak w przypadku omawianych tutaj ręcznych zmian.Aby zainstalować, uruchom główny plik wykonywalny Cygwin. To ten o nazwie setup-x86_64.exe lub coś w tym stylu. Upewnij się, że widzisz taki ekran:
Ponieważ już wykonałeś podstawową instalację, powinieneś być w stanie kliknąć Dalej do końca, aż pojawi się ekran wyboru. Wybierz Pełny z menu rozwijanego i wpisz „dos2” w polu wyszukiwania i wybierz narzędzie, jak pokazano tutaj:
Następnie ponownie kliknij przycisk Dalej i pozwól instalacji zakończyć. Otóż to. Baw się dobrze. Cygwin, z wyjątkiem tych sporadycznych niedogodności, jest niesamowitym pakietem.
źródło
Jeśli nie dos2unix, istnieje również „flip”
$ flip -u twoja nazwa pliku.txt
zamieni go na użycie zakończeń linii unix.
źródło
Używam Notepad ++ do edycji moich skryptów bash (.sh), łącząc się z serwerem za pomocą WinSCP
(aby skonfigurować edytor WinSCP do Notepad ++: https://winscp.net/eng/docs/ui_editor_preferences )
Jest to bardzo praktyczne przy otwieraniu plików z serwerów do edycji / zapisywania zamiast edytora „ Vim ”.
Po otwarciu pliku w Notepad ++ kliknij dwukrotnie siódmą kolumnę na pasku stanu na dole i wybierz „ Unix (LF) ”.
Musisz także zmienić ósmy, kodując -> Zakoduj w UTF-8 na górnym pasku.
źródło
Nie trzeba zmieniać faktycznego kodowania linii pliku, aby Cygwin's Bash z przyjemnością współpracował z kodowaniem końca linii w systemie Mac i Windows. Istnieje opcja, którą musisz tylko włączyć.
Po prostu zaktualizuj,
~/.bash_profile
aby zawierałZobacz https://ptolemy.berkeley.edu/projects/chess/softdevel/faq/5.html
źródło