为什么在远程计算机上运行脚本时文件名为什么包含问号?


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 2014年

@ 0xC0000022L输出为LANG=en_US.UTF-8
Gottlieb Notschnabel 2014年

抱歉,不清楚。我的意思是两端的输出。
0xC0000022L 2014年

对不起,我很想念...很遗憾,此命令在Windoze上未输出任何内容:/
Gottlieb Notschnabel 2014年

1
您是否知道重定向的顺序(2>&1 >> $FILE)将stderr发送到终端,将stdout发送到文件?如果您也希望stderr转到文件,则需要>> $FILE 2>&1
格伦·杰克曼

Answers:


17

您可能在行尾有一些不可打印的字符(例如Windows的CRLF),请运行:

cat -A scriptname

在远程计算机上,它将显示脚本中的所有字符。然后,您可以将其转换为类unix格式的运行

dos2unix scriptname

3

发现记事本++对于尝试答案后的纠正非常有用

cat -A脚本名>

dos2unix脚本名

因为尝试转换时仍然会出现错误。

通过记事本++,可以在编辑菜单/ EOL转换/ Unix / OSX格式中进行选择。

仍然是一个学习者,但是这种方法解决了我的问题,但是以前的解决方案有助于发现问题所在。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.