2015-04-13 16 views
5

Używam VM (w moim przypadku po prostu boot2docker) do uruchamiania kontenerów docker na hoście Windows. Dla wygody moje pliki źródłowe są mapowane z systemu plików hosta, więc pliki tekstowe domyślnie używają końcówek linii CRLF w stylu Windows zamiast końcówek LF w stylu Unix.Bash - płynnie uruchamiane skrypty z końcówkami linii CRLF

Kiedy próbuję uruchomić jakiś plik .Sh z pojemnika Döcker, będę się błąd

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

Czy istnieje sposób, w jaki mogę jakoś powiedzieć bash/sh tłumacza automatycznie konwertować \ r \ n do \ n i uruchomić plik?

Pewnie, mógłbym dodać pseudolekcję w ten sposób, cat script.sh | tr -d "\r" | sh lub nawet utworzyć dla niej alias, ale nie dotyczy to sytuacji, w której jeden skrypt zawiera inny.

Jedynym akceptowalnym rozwiązaniem, jakie znalazłem do tej pory, jest ustawienie Gita na pliki źródłowe do kasy w formacie UNIX.

+0

Czy możesz napisać "echo $ TERM"? – user2915097

+0

Jest to standardowy kontener dokera, 'echo $ TERM' zwraca' głupi' – trebi

+0

spróbuj 'export TERM = xterm' lub' exec>/dev/tty 2>/dev/tty user2915097

Odpowiedz

1

Najlepsze rozwiązanie, jakie mam, polega na tym, aby używać edytorów (takich jak Notepad ++ lub Sublime Text) do zapisywania bezpośrednio w odpowiednim stylu eol.

W ten sposób, nie muszę do dos2unix żadnego pliku w mojej sesji boot2docker.

2

W przypadku niektórych skryptów rozwiązanie ln -s /bin/bash /bin/bash^M zakończy się niepowodzeniem.
Stwórz więc skrypt/bin/bash^M który dos2unix dostanie argumenty i uruchom je za pomocą "[email protected]".

Edit: próbowałem go z poniższej bash^M skryptu:

#!/bin/bash 
PROG=$1 
shift 
dos2unix $PROG > /dev/null 2>&1 
$PROG "[email protected]" 

to zawiedzie, gdy skrypt zawiera inne skrypty z kropką, w takim przypadku należy unikać tej pracy wokół i przejść dla formatu Unix.
Powiedziałeś, że możesz zapłacić w systemie Unix, lub możesz samodzielnie zmienić pliki.
I zobowiąż się do git, ulepszeniem jest posiadanie plików unix przechowywanych w git w formacie unix. Jeśli naprawdę chcesz je edytować w systemie Windows, zmień ustawienia edytora lub dos2unix później.

+0

To wygląda na sprytne podejście! Kiedy więc utworzę plik '/ bin/bash^M', pozbędę się błędu' bash: ./script.sh:/bin/bash^M: bad interpreter: Nie ma takiego pliku lub katalogu ', ale zrobię wprowadzić inny błąd 'script.sh: linia 2: $ '\ r': command not found', gdzie linia 2 ma być pusta linia, ale tłumacz uważa, że ​​istnieje polecenie o nazwie' \ r. – trebi

+0

Dlatego Twój bash^M nie powinien wywoływać bash bezpośrednio, ale najpierw dos2unix/tr skrypt, który ma zostać uruchomiony. –

0

sobie wyobrazić, można napisać skrypt, takich jak

#!/bin/bash 
#bash_run_unixified 
#unixify and run in bash 
dos2unix < "$1" | /bin/bash 

i zakładając, że zapisany w/urs/local/bin/bash_run_unixified z odpowiednimi uprawnieniami (sudo chmod o+r,o+x), a następnie można poprzedzić skrypty z

#!/usr/local/bin/bash_run_unixified 
#This script has CRLFs in it 

Jeśli nie chcesz takie nietypowe linie shebang, można

$ ln -s /usr/local/bin/{bash_run_unixified,bash} 

a następnie użyć (jak Walter A. notatek, to może być dobry pomysł, aby połączyć go z bash^M zbyt)

#!/usr/bin/env bash 

jako linii shebang (/usr/local/bin/ jest zwykle bliżej początku swojego $PATH niż /bin więc komenda env powinna wybrać bash, która łączy się z bash_run_unixified).

(uwaga: Ja nie testowałem żadnej z tego)

2

można popełnić plik .gitattributes w repo w folderze głównym, aby automatycznie powiedzieć Git zastosować końca linii LF do wszystkich plików .Sh podczas sprawdzania, nawet w systemie Windows. W ten sposób ty lub inni deweloperzy nie musicie pamiętać, aby skonfigurować Git na każdym komputerze, na którym klonowane jest repozytorium.

# Set line endings to LF, even on Windows. Otherwise, execution within Docker fails. 
# See https://help.github.com/articles/dealing-with-line-endings/ 
*.sh text eol=lf