เหตุใดชื่อไฟล์จึงมีเครื่องหมายคำถามเมื่อฉันเรียกใช้สคริปต์บนเครื่องระยะไกลของฉัน


10

ฉันมีสคริปต์เล็ก ๆ ที่ดึงข้อมูลวันที่ปัจจุบันเรียกใช้สคริปต์ PHP และเปลี่ยนเส้นทางผลลัพธ์ (และข้อผิดพลาด) ไปยังชื่อไฟล์ที่มีวันที่ปัจจุบัน

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

เมื่อฉันเรียกใช้สคริปต์นี้บนเครื่องท้องถิ่นของฉัน (Windows 7 Aptana IDE) ที่สคริปต์ PHP ทำงานได้ดีและ logfile 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เอาท์พุท
Gottlieb Notschnabel

ขอโทษที่ไม่ชัดเจน ฉันหมายถึงผลลัพธ์ที่ปลายทั้งสอง
0xC0000022L

ขออภัยที่หายไป ... โชคไม่ดีที่คำสั่งนี้ไม่แสดงผลใด ๆ บน Windoze: /
Gottlieb Notschnabel

1
คุณทราบหรือไม่ว่าลำดับการเปลี่ยนเส้นทางนี้ ( 2>&1 >> $FILE) ส่ง stderr ไปยังเทอร์มินัลและ stdout ไปยังไฟล์ หากคุณต้องการ stderr ไปที่ไฟล์เช่นกันคุณต้อง>> $FILE 2>&1
glenn jackman

คำตอบ:


17

คุณอาจมีอักขระที่ไม่สามารถพิมพ์ได้ที่ปลายบรรทัด (เช่น CRLF จาก Windows) ให้เรียกใช้:

cat -A scriptname

บนเครื่องระยะไกลมันจะแสดงอักขระทั้งหมดในสคริปต์ของคุณ จากนั้นคุณสามารถแปลงเป็นรูปแบบยูนิกซ์ที่กำลังทำงานอยู่

dos2unix scriptname

3

พบว่า Notepad ++ มีประโยชน์มากสำหรับการแก้ไขหลังจากพยายามตอบคำถาม

cat -A scriptname>

dos2unix scriptname

เนื่องจากยังคงมีข้อผิดพลาดเมื่อพยายามแปลง

ผ่าน Notepad ++ มีตัวเลือกในเมนูแก้ไข / การแปลง EOL / รูปแบบ Unix / OSX

ยังเป็นผู้เรียนมาก แต่วิธีนี้แก้ปัญหาของฉันได้ แต่วิธีการก่อนหน้านี้ช่วยในการค้นหาว่าปัญหาเกิดขึ้นที่ใด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.