ปัญหาในสคริปต์ด้วยช่องว่างในชื่อไฟล์


11

ฉันมีสคริปต์ที่ scp เป็นไฟล์จากโฮสต์ระยะไกลกลับสู่ท้องถิ่น บางครั้งชื่อไฟล์มีช่องว่าง scp ไม่ชอบช่องว่างในชื่อไฟล์ ด้วยเหตุผลบางประการความพยายามของฉันในการจัดการช่องว่างไม่ได้ส่งผลให้เส้นทาง scp ที่ถูกต้อง

รหัส:

PATH=/var/root/Documents/MyFile OG-v1.2.3.pkg
scp $PATH Me@10.1.10.33:/Users/Me/Desktop

ผลลัพธ์ใน

Cannot find directory: var/root/Documents/MyFile
Cannot find directory: OG-v1.2.3.pkg

การใส่ PATH ในเครื่องหมายคำพูด"$PATH"ทำให้เกิดข้อผิดพลาดเดียวกัน

การสลับช่องว่างสำหรับช่องว่างที่หลบหนียังไม่ทำงานแม้ว่าเท่าที่ฉันสามารถบอกได้ก็ควรจะ:

ESC_PATH=${PATH/' '/'\ '}

แม้ว่าการพิมพ์พา ธ ที่หลบหนีแสดงว่าการแก้ไขทำงานได้:

echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg

4
โปรดอย่าใช้$PATHสำหรับตัวแปรของคุณเองเพราะเทอร์มินัลของคุณต้องการมัน
แบร์นฮาร์ด

คำตอบ:


19

คุณควรอ้างอิงทั้งการประกาศและการใช้งาน

path="/var/root/Documents/MyFile OG-v1.2.3.pkg"
scp "$path" Me@10.1.10.33:/Users/Me/Desktop

หากคุณไม่อ้างอิงส่วนแรก$pathจะมีเพียงส่วนแรก หากคุณไม่ได้อ้างอิงที่สองscpจะถือว่าแต่ละส่วนที่คั่นด้วยช่องว่างเป็นอาร์กิวเมนต์

(ฉันเปลี่ยน$PATHเป็น$pathเพราะ$PATHเป็นตัวแปรสำรองที่สำคัญและคุณต้องไม่ใช้เพื่อวัตถุประสงค์ทั่วไป)


1
ที่สมบูรณ์แบบ! ขอบคุณล้าน @Matteo กลับกลายเป็นว่ามีพื้นที่นำหน้าขว้างประแจเข้าไปด้วย
Miles Alden

1

ฉันพยายามทำสิ่งที่คล้ายกันมากกับ ssh และส่งบรรทัดคำสั่งผ่านมัน เช่น

ssh <somehost> ls -l "$PATH"

ฉันพบว่าเพียงแค่กำหนด "$ PATH" ไม่ได้ทำเคล็ดลับ - มันยังคงโยนข้อผิดพลาด อย่างไรก็ตามถ้าฉันวิ่ง

ssh <somehost> ls -l "\"$PATH"\"

สิ่งนี้ใช้ได้ผล เคล็ดลับคือเพื่อให้แน่ใจว่าชุดของ "" ถูกส่งผ่านไปยังคำสั่ง ssh จากเชลล์

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