Dlaczego nazwa pliku zawiera znaki zapytania, kiedy uruchamiam skrypt na zdalnym komputerze?

10

Mam mały skrypt, który po prostu pobiera bieżącą datę, uruchamia skrypt PHP i przekierowuje dane wyjściowe (i błędy) do nazwy pliku zawierającej bieżącą datę.

DATE=$(date +"%Y%m%d")
FILE="log/${DATE}.log"
php -q script.php >> $FILE 2>&1

Kiedy uruchamiam ten skrypt na moim komputerze lokalnym (Windows 7, Aptana IDE), skrypt PHP działa dobrze, a plik dziennika ma oczekiwaną nazwę pliku, np 20140502.log.

Ale kiedy wypycham ten skrypt za pomocą SFTP na moją zdalną maszynę i wykonuję ten skrypt, nazwa pliku wygląda następująco:

20140502?.log?

Co może być problemem? Czy to błąd kodowania (np. Kodowanie dla przesyłania SFTP to ANSII, gdzie oczekuje się UTF-8)? Czy też muszę coś zmienić w samym skrypcie?

Informacje o systemie / powłoce:

[foo@bar path]$ sh --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

Zabawny fakt: jeśli ten skrypt jest wywoływany przez cronjob, znaki zapytania nie występują. Tylko jeśli ręcznie uruchomię skrypt.

Gottlieb Notschnabel
źródło
Zazwyczaj ?oznacza, że ​​znak nie może zostać wyświetlony. Z pewnością brzmi jak różnica w kodowaniu. Czy możesz podać nam wynik env|grep -E '(LC|LANG)'?
0xC0000022L
@ 0xC0000022L Wyjście to LANG=en_US.UTF-8.
Gottlieb Notschnabel
przepraszam, że jestem niejasny. Miałem na myśli wyjście na obu końcach.
0xC0000022L
Przepraszamy za brakujące ... Niestety to polecenie nic nie wyświetla w Windoze: /
Gottlieb Notschnabel
1
Czy wiesz, że ta sekwencja przekierowań ( 2>&1 >> $FILE) wysyła stderr do terminala, a stdout do pliku? Jeśli chcesz, aby stderr również poszedł do pliku, potrzebujesz>> $FILE 2>&1
glenn jackman

Odpowiedzi:

17

Prawdopodobnie masz jakieś niedrukowalne znaki na końcu linii (np. CRLF z Windows), uruchom:

cat -A scriptname

na zdalnym komputerze pokaże wszystkie znaki w twoim skrypcie. Następnie możesz przekonwertować na działający format uniksowy

dos2unix scriptname
etap
źródło
3

Stwierdzono, że Notepad ++ jest bardzo przydatny do rozwiązania tego problemu po próbie odpowiedzi

cat -A

nazwa skryptu > nazwa skryptu dos2unix

ponieważ nadal występowały błędy podczas próby konwersji.

Za pomocą Notepad ++ dostępna jest opcja w menu edycji / Konwersja EOL / Format Unix / OSX.

Wciąż bardzo uczący się, ale ta metoda rozwiązała mój problem, jednak poprzednie rozwiązanie pomogło w ustaleniu, gdzie był problem.

Phoe
źródło