원격 컴퓨터에서 스크립트를 실행할 때 파일 이름에 물음표가 포함되는 이유는 무엇입니까?


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 업로드를위한 인코딩은 UTF-8이 예상되는 ANSII입니다. 아니면 스크립트 자체에서 아무것도 변경해야합니까?

시스템 / 쉘에 대한 정보 :

[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입니다.
Gottlieb Notschnabel

불분명해서 죄송합니다. 나는 양쪽 끝에 출력을 의미했다.
0xC0000022L

죄송합니다.이 명령은 Windoze에서 아무것도 출력하지 않습니다 : /
Gottlieb Notschnabel

1
이 일련의 리디렉션 ( 2>&1 >> $FILE)은 stderr을 터미널로 보내고 stdout을 파일로 보냅니다. stderr도 파일로 이동하려면 다음이 필요합니다.>> $FILE 2>&1
glenn jackman

답변:


17

줄 끝에 인쇄 할 수없는 문자가있을 수 있습니다 (예 : Windows의 CRLF).

cat -A scriptname

원격 컴퓨터에서는 스크립트의 모든 문자가 표시됩니다. 그런 다음 실행중인 유닉스와 같은 형식으로 변환 할 수 있습니다

dos2unix scriptname

3

메모장 ++는 답변을 시도한 후이를 수정하는 데 매우 유용합니다.

고양이-스크립트 이름>

dos2unix 스크립트 이름

변환하려고 할 때 여전히 오류가 발생했기 때문입니다.

메모장 ++를 통해 편집 메뉴 / EOL 변환 / 유닉스 / OSX 형식에 옵션이 있습니다.

여전히 많은 학습자가 있지만이 방법으로 문제를 해결했지만 이전 솔루션은 문제의 위치를 ​​찾는 데 도움이되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.