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.
źródło
?
oznacza, że znak nie może zostać wyświetlony. Z pewnością brzmi jak różnica w kodowaniu. Czy możesz podać nam wynikenv|grep -E '(LC|LANG)'
?LANG=en_US.UTF-8
.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
Odpowiedzi:
Prawdopodobnie masz jakieś niedrukowalne znaki na końcu linii (np. CRLF z Windows), uruchom:
na zdalnym komputerze pokaże wszystkie znaki w twoim skrypcie. Następnie możesz przekonwertować na działający format uniksowy
źródło
Stwierdzono, że Notepad ++ jest bardzo przydatny do rozwiązania tego problemu po próbie odpowiedzi
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.
źródło