ใครจะหนี““” (สำเนียงหลุมฝังศพ / backtick) ในเส้นทาง?


13

ฉันมักจะนำหน้าไฟล์และโฟลเดอร์ที่ใช้คำนำหน้าด้วยอักขระ "สำเนียงหลุมฝังศพ" (เครื่องหมายตัวหนอนไม่ใช่แบบ non-shift, back-tick, หรือสำเนียงแบบเก่าธรรมดา, whathaveyou .. ) เนื่องจากง่ายต่อการไปและขอฉัน จัดเรียงสิ่งต่าง ๆ ตามตัวอักษรในขณะที่ให้ฉันเลือกที่จะแสดงรายการด้านบน มันทำงานได้ดียกเว้นเมื่อฉันไปใช้ไฟล์เหล่านี้ผ่าน CLI หรือ SSH / SCP

หากฉันพยายามเรียกใช้คำสั่งการเรียกไฟล์ที่ไม่ใช้ค่า Escape มันจะทำให้ฉันเข้าสู่เซสชันการโต้ตอบ .. เช่น↯

# scp -r dns.local:/`Downloads/CrazyRussianCars/ ~/
↩
>

แต่ถ้าฉันลองวิธีแก้ปัญหาเชิงตรรกะ↯

# scp -r dns.local:/\`Downloads/CrazyRussianCars/ ~/
↩
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

ฉันรู้ว่ากฎ "ใหม่" คือการใช้ไวยากรณ์เช่น export NOW=$(date)vs export NOW= `date` (อันที่จริงฉันมีช่วงเวลาหนึ่งถึงแม้จะเขียนหลังในไวยากรณ์ SE MD ... ) แต่นี่ไม่เกี่ยวข้องกับENVสคริปต์ใด ๆ ..

หมายเหตุ: นี่คือสภาพแวดล้อม Mac OS X แต่ที่กล่าวว่า GUI ไม่เคยมีปัญหาในการจัดการกับตัวละครนี้ในชีวิตประจำวันและโดยปกติหากมีปัญหาเกี่ยวกับไวยากรณ์ใน Terminal, Apple มันทำงานได้ค่อนข้างดีในการปิดการใช้งานพฤติกรรมใน GUI ... ไม่แน่ใจว่านี่เป็นข้อผิดพลาดหรือถ้าเทคนิคสำหรับการจัดการกับเส้นทางดังกล่าวเป็นเพียงแค่คลุมเครือ .. แต่จนถึงตอนนี้ฉันไม่สามารถหา ทาง "เพื่อหนีมัน" ?


ทำไมไม่ใช้ตัวละครที่ไม่ต้องการหนีเหมือนหมายเลข 1?
JamesRyan

backtick คือ - มองเห็น - รบกวนน้อยลง (สำหรับฉัน), และมีสัมภาระความหมายโดยธรรมชาติน้อยลงเมื่อทำการกำหนดใหม่เป็นตัวคั่นการเรียงลำดับ
mralexgray

คำตอบ:


10

คุณสามารถใช้แบ็กสแลช 3 รายการตามที่ Jed Daniels พูดถึงหรือคุณสามารถใส่ไว้ในเครื่องหมายคำพูดเดี่ยว(')และใช้เครื่องหมายแบ็กสแลชเดี่ยว

ตัวอย่างของทั้งคู่อยู่ด้านล่าง

$ touch dir/'`rik' 
$ ls -l dir
total 1865376
-rw-r--r--  1 rik  staff          0 Jul  1 09:51 `rik 
$ scp localhost:dir/\\\`rik ./ `rik         
100%    0     0.0KB/s   00:00     
$ scp localhost:dir/'\`rik' ./ `rik     
100%    0     0.0KB/s   00:00     
$

น่ากลัว ฉันเดาว่าฉันจะเลือกคำตอบนี้เพราะมันดีที่มีสองวิธี ไม่ว่าคุณจะสามารถใช้เทคนิคนี้ในพื้นที่ได้โดยใช้เพียงแค่หนึ่งสแลชหรือสแลช - อาเวิร์สไม่มีสแลชและเพียงเทคนิคอ้างเดี่ยวรอบไฟล์หรือไดเรกทอรีที่มีปัญหา .. ขอบคุณ!
mralexgray

5

สามแบ็กสแลชควรทำ:

jed@jed-osx:~$ ls -la \`foo
ls: `foo: No such file or directory
jed@jed-osx:~$ scp desk:\\\`foo .
`foo                                            100%    0     0.0KB/s   00:00    
jed@jed-osx:~$ ls -la \`foo
-rw-r--r--  1 jed  staff  0 Jul  1 09:45 `foo
jed@jed-osx:~$ rm \`foo

เครื่องหมายแบ็กสแลชแรกหนี backtick ดังนั้นมันจึงถูกส่งไปอีกด้านหนึ่ง แต่อีกฝั่งหนึ่งโยนข้อผิดพลาดเนื่องจากคาดว่าแบ็คคิกจะอยู่ในคู่ แบ็กสแลชที่สองจะหนีจากแบ็กสแลชแรกจากนั้นคุณจำเป็นต้องใช้แบ็กสแลชสองตัวเพิ่มเติมเพื่อให้คุณสามารถส่งแบ็กสแลชที่หนีไปทางด้านอื่น ๆ ได้

แก้ไข: ตามที่ Rik กล่าวถึงคุณสามารถทำได้ด้วยคำพูดเดียว ฉันไม่ได้คิดเรื่องนี้เพราะคุณไม่สามารถเราด้วยตัวแปร (พวกเขาจะไม่ได้รับการขยายในระบบท้องถิ่นเมื่ออยู่ในคำพูดเดียว)


3

โดยปกติบรรทัดคำสั่งจะถูกตีความโดยเชลล์หนึ่งครั้ง แต่สำหรับเหตุผลทางประวัติศาสตร์ SCP ผ่านชื่อไฟล์เพื่อเปลือกระยะไกลเช่นกันดังนั้นชื่อไฟล์ที่ได้รับการตีความโดยเปลือกหอยสองครั้ง และนี่ก็เป็นสิ่งที่ทำให้สิ่งที่ต้องการทำงานเปลือกระยะไกลมีการขยายตัวscp remote:'/path/prefix*' /path/local//path/prefix*

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

นอกเหนือจากนั้นคุณสามารถใช้กลไกการอ้างอิงเชลล์ปกติใด ๆ รวมถึงที่ได้รับจาก @Jed Daniels และ @Rik Schneider แต่ฉันต้องการอธิบายสิ่งที่เกิดขึ้นจริงและพูดถึง sftp

(คุณสามารถใช้ทุกชนิดของคุณสมบัติเปลือกในชื่อไฟล์ SCP ของคุณตัวอย่างเช่นscp server:\$HOME/file destจะใช้ระยะไกลความคิดของเปลือกของ$HOMEในขณะที่ถ้าคุณเอาออก\ก็ต้องการใช้ในท้องถิ่นของเปลือก.)

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