Mengapa nama file mengandung tanda tanya ketika saya menjalankan skrip di mesin jarak jauh saya?

10

Saya memiliki skrip kecil yang hanya mengambil tanggal saat ini, menjalankan skrip PHP dan mengarahkan output (dan kesalahan) ke nama file yang berisi tanggal saat ini.

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

Ketika saya menjalankan skrip ini di komputer lokal saya (Windows 7, Aptana IDE), skrip PHP berfungsi dengan baik dan file log memiliki nama file yang diharapkan, misalnya 20140502.log.

Tetapi ketika saya mendorong skrip itu melalui SFTP ke mesin jarak jauh saya dan menjalankan skrip itu, nama filenya terlihat seperti ini:

20140502?.log?

Apa yang mungkin menjadi masalah? Apakah ini kesalahan enconding (mis. Encoding untuk unggahan SFTP adalah ANSII, di mana UTF-8 diharapkan)? Atau apakah saya harus mengubah apa pun dalam skrip itu sendiri?

Informasi tentang sistem / shell:

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

Fakta lucu: Jika skrip itu dipanggil oleh cronjob, tanda tanya tidak muncul. Hanya jika saya menjalankan skrip secara manual.

Gottlieb Notschnabel
sumber
Biasanya ini ?menunjukkan bahwa karakter tidak dapat ditampilkan. Jelas terdengar seperti perbedaan enkode. Bisakah Anda memberi kami hasil env|grep -E '(LC|LANG)'?
0xC0000022L
@ 0xC0000022L Output adalah LANG=en_US.UTF-8.
Gottlieb Notschnabel
maaf karena tidak jelas. Maksud saya output di kedua ujungnya.
0xC0000022L
Maaf karena melewatkan itu ... Sayangnya perintah ini tidak menampilkan apa pun di Windoze: /
Gottlieb Notschnabel
1
Apakah Anda mengetahui bahwa urutan pengalihan ini ( 2>&1 >> $FILE) mengirimkan stderr ke terminal dan stdout ke file? Jika Anda ingin stderr pergi ke file juga, Anda perlu>> $FILE 2>&1
glenn jackman

Jawaban:

17

Anda mungkin memiliki beberapa karakter yang tidak dapat dicetak pada akhir baris (mis. CRLF dari Windows), jalankan:

cat -A scriptname

pada mesin jarak jauh, itu akan menampilkan semua karakter dalam skrip Anda. Kemudian, Anda dapat mengonversi ke format unix-like running

dos2unix scriptname
fazie
sumber
3

Notepad ++ ditemukan sangat berguna untuk memperbaiki ini setelah mencoba jawabannya

cat -A scriptname>

dos2unix scriptname

karena ini masih menyajikan kesalahan ketika mencoba untuk mengkonversi.

Melalui Notepad ++ ada opsi di menu edit / EOL Conversion / Unix / OSX Format.

Masih sangat banyak belajar tetapi metode ini memecahkan masalah saya, namun solusi sebelumnya membantu dalam menemukan di mana masalahnya.

Phoe
sumber