Cygwin - cd w skrypcie bash

12

Jestem nowy w używaniu Cygwin, więc przepraszam, jeśli jest to bardzo początkujące pytanie.

Mam skrypt bash, w którym „cd” do katalogu, a następnie zrobić coś w tym katalogu. Jednak polecenie cd kończy się niepowodzeniem z komunikatem „Brak takiego pliku lub katalogu / c / code / blah / blah”.

Jeśli skopiuję linię cd bezpośrednio do zachęty powłoki, to działa dobrze. Po prostu zawodzi w skrypcie.

[edytuj] Zgodnie z prośbą dodałem rzeczywiste wiersze ze skryptu:

#!/bin/bash
cd /c/Code/Project

Dziękuję za pomoc,
Dan.

Dan
źródło
1
Czy możesz opublikować aktualne wiersze ze skryptu?
Wstrzymano do odwołania.

Odpowiedzi:

18

Jakie zakończenia linii ma twój skrypt? Aby skrypt bash Cygwin działał poprawnie (bez konieczności ustawiania specjalnych opcji), musi mieć końcówki linii uniksowej (LF) zamiast końców linii DOS (CR-LF). Jeśli zapisałeś skrypt z zakończeniami linii DOS, bash zobaczy twój argument cdjako as /c/Code/Project^M, gdzie ^Mjest CR i nie znajdzie katalogu o tej nazwie.

Aby sprawdzić, jaki rodzaj zakończeń linii ma, można wykonać file scriptname, gdzie scriptname to nazwa skryptu. Aby przekonwertować skrypt w taki sposób, aby zawierał końcówki linii uniksowych, uruchom d2u scriptname.

Nie używaj Notatnika do edycji skryptów bash Cygwin. Zawsze zapisuje pliki z zakończeniami linii DOS.

garyjohn
źródło
Aha! To było to. Użyłem Vima do jego edycji. Dziękuję :-)
Dan
Vim będzie działał dobrze. Automatycznie wykrywa, czy pliki mają końcówki linii w systemie Unix lub DOS i zapisuje je w ten sam sposób. Domyślnie vim Cygwina utworzy nowe pliki z zakończeniami linii Uniksa, ale gvim systemu Windows utworzy nowy plik z zakończeniami linii DOS. Możesz to zmienić. Zobacz :help ffi :help ffs.
garyjohn
Emacs oszczędzał również dzięki CR-LF. Zmiana stylu edytora zakończenia linii: emacswiki.org/emacs/EndOfLineTips
jfklein
3

O ile nie przesłonisz, skrypt wykonuje się we własnej kopii powłoki (zwykle Bash). Następnie, gdy skrypt kończy działanie, kończy się również wystąpienie bash. Więc twoje skrypty CD do nowego katalogu, a następnie zamykają się, wracając do oryginalnego Bash - który nigdy nie zrobił CD.

Dwa sposoby obejścia tego. Możesz użyć aliasu zamiast skryptu, np. W .profile

alias mycd="cd /c/Code/Project"

Innym sposobem jest powiedzenie Bashowi, aby nie tworzył podpowłoki przy użyciu składni „kropka”

. myscript
CarlF
źródło
Źle odczytałeś moje pytanie. Komunikat o błędzie, o który pytałem, jest zapisywany na standardowe wyjście za pomocą polecenia cd, które znajduje się w skrypcie. Nie proszę o zmianę bieżącego katalogu po wyjściu ze skryptu.
Dan
Miałem podobny problem do OP, ale bez błędów; ta odpowiedź bardzo mi pomogła, nawet jeśli nie jest to „w 100% na temat”.
Frosty Z
2

Możesz znaleźć swoje pliki w / cygdrive / c ...

Xenoactive
źródło
1

Próbować:

cd /cygdrive/c/code/blah/blah

Mike Fitzpatrick
źródło
To zadziała dla 'cd c:/code/blah/blah„nie dla 'cd /c/code/blah/blah”. Również formularz „ c:” działa również ze skryptu; Czegoś tu brakuje, pytanie wymaga dalszego dopracowania.
nik
To nie zadziałało.
Dan
@nik formularz c: również nie działał. Nic, co próbuję, działa ze skryptu. Wszystkie działają z wiersza poleceń.
Dan
1

Nie mam reputacji, aby komentować lub głosować, ale odpowiedź CarlFa pomogła mi.

„Więc twoje skrypty CD do nowego katalogu, a następnie wychodzą, powracając do oryginalnej wersji Bash - która nigdy nie zrobiła płyty CD”

Ten sam skrypt, ale w moim przypadku nie ma komunikatu o błędzie.

To działało dla mnie:

. myscript.sh

PJ Brunet
źródło