Почему в имени файла содержатся вопросительные знаки при запуске сценария на моей удаленной машине?

10

У меня есть крошечный скрипт, который просто выбирает текущую дату, запускает скрипт PHP и перенаправляет вывод (и ошибки) в имя файла, содержащее текущую дату.

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

Когда я запускаю этот скрипт на моем локальном компьютере (Windows 7, Aptana IDE), скрипт PHP работает нормально, и у файла журнала есть ожидаемое имя файла, например 20140502.log.

Но когда я отправляю этот скрипт через SFTP на мою удаленную машину и выполняю этот скрипт, имя файла выглядит так:

20140502?.log?

В чем может быть проблема? Является ли это конечной ошибкой (например, кодировка для загрузки SFTP - ANSII, где ожидается UTF-8)? Или я должен что-то изменить в самом скрипте?

Информация о системе / оболочке:

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

Забавный факт: если этот скрипт вызывается cronjob, вопросительные знаки не появляются. Только если я запускаю скрипт вручную.

Готтлиб Нотшнабель
источник
Обычно ?указывает, что символ не может быть отображен. Конечно, звучит как разница кодировки. Можете ли вы дать нам вывод env|grep -E '(LC|LANG)'?
0xC0000022L
@ 0xC0000022L Выход есть LANG=en_US.UTF-8.
Готтлиб Нотшнабель
извините за то, что неясно. Я имел ввиду выход на обоих концах.
0xC0000022L
Извините, что пропустил это ... К сожалению, эта команда ничего не выводит на Windoze: /
Gottlieb Notschnabel
1
Вам известно, что эта последовательность перенаправлений ( 2>&1 >> $FILE) отправляет stderr в терминал и stdout в файл? Если вы хотите, чтобы stderr также >> $FILE 2>&1
зашел

Ответы:

17

Вероятно, у вас есть некоторые непечатаемые символы в конце строк (например, CRLF из Windows), запустите:

cat -A scriptname

на удаленной машине, он покажет вам все символы в вашем скрипте. Затем вы можете конвертировать в Unix-подобный формат

dos2unix scriptname
fazie
источник
3

Нашел Notepad ++ очень полезным для исправления после попытки ответа

cat -A имя сценария>

dos2unix имя сценария

поскольку это все еще представляло ошибки при попытке конвертировать.

Через Notepad ++ есть опция в меню редактирования / EOL Conversion / Unix / OSX Format.

Все еще очень ученик, но этот метод решил мою проблему, однако предыдущее решение помогло найти, где была проблема.

Phoe
источник