Bash script เป็น cd ไปยังไดเร็กทอรีที่มีช่องว่างในชื่อพา ธ


96

ฉันใช้ Bash บน macOS X และฉันต้องการสร้างไฟล์สคริปต์ปฏิบัติการง่ายๆที่จะเปลี่ยนเป็นไดเร็กทอรีอื่นเมื่อเรียกใช้ อย่างไรก็ตามเส้นทางไปยังไดเร็กทอรีนั้นมีช่องว่างอยู่ คุณทำสิ่งนี้ได้อย่างไร? นี่คือสิ่งที่ฉันมี ...

ชื่อไฟล์: cdcode

เนื้อหาไฟล์:

cd ~/My Code

ตอนนี้ได้รับแล้วนี่ไม่ใช่ชื่อพา ธ ที่ยาว แต่ชื่อพา ธ จริงของฉันคือห้าไดเร็กทอรีลึกและสี่ไดเร็กทอรีเหล่านั้นมีช่องว่างในพา ธ

BTW ฉันได้ลองcd "~/My Code"แล้วcd "~/My\ Code"และไม่ได้ผล


1
ฉันกำลังมีปัญหาคล้ายกับที่อธิบายไว้ กล่าวคือไม่มีวิธีใดที่เป็นไปได้ในการเปลี่ยนเป็นไดเร็กทอรีที่มีช่องว่างอยู่ ไม่มีอะไรเช่น cd "My Passport" cd My \ Passport cd "Passport" ของฉันไม่มีอะไรทำงาน คำชมใช้งานได้ดี ฉันสามารถแสดงรายการ: ls -l My \ Passport / ทำงานได้ดี \> uname -a โฮสต์ Linux 2.6.18-8.1.8.el5.centos.plus # 1 SMP จ. 16 ก.ค. 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash เวอร์ชัน 3.1 .17 (1) -release- (i686-redhat-linux-gnu) มีความคิดเห็นอย่างไร
Denis C

คำตอบ:


81

เมื่อคุณอ้างถึงเส้นทางสองครั้งคุณกำลังหยุดการขยายตัวทิลเดอร์ ดังนั้นมีสองสามวิธีในการดำเนินการนี้:

cd ~/"My Code"
cd ~/'My Code'

ไม่ได้ยกเครื่องหมายทิลเดอมาที่นี่ดังนั้นการขยายทิลเดอร์จะยังคงทำงานอยู่

cd "$HOME/My Code"

คุณสามารถขยายตัวแปรสภาพแวดล้อมภายในสตริงที่ยกมาสองครั้ง นี่คือสิ่งที่การขยายตัวหนอนกำลังทำอยู่

cd ~/My\ Code

คุณยังสามารถหลีกเลี่ยงอักขระพิเศษ (เช่นช่องว่าง) ด้วยแบ็กสแลช


3
คุณสามารถแม้กระทั่ง cd ~ / My' 'รหัส แต่ที่จะโง่เมื่อคุณสามารถหลบหนีด้วยเครื่องหมายแทน
นิค Dixon

42

ฉันพบวิธีแก้ปัญหาด้านล่างในหน้านี้ :

x="test\ me"  
eval cd $x

การรวมกันของ\ค่าคงที่ของข้อความที่ยกมาสองครั้งและevalก่อนหน้าcdทำให้มันทำงานได้อย่างมีเสน่ห์!


ความชัดเจนมากขึ้น: สำหรับ cd'ing ไปยังไดเร็กทอรีของไฟล์สคริปต์: DIR = $ (dirname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert

1
สิ่งนี้ช่วยฉันได้มากในการเรียกใช้ bash-script บนเครื่อง OS X 🎉
timbillstrom

evalที่นี่ไม่จำเป็นจริงๆ
Benjamin W.

2
บน OS X, ฉันไม่สามารถรับอื่น ๆ / evalคำตอบก่อนที่จะทำงานได้โดยไม่ต้อง
D วู้ดส์

11

หลังจากต่อสู้กับปัญหาเดียวกันฉันได้ลองวิธีแก้ปัญหาสองวิธีที่ใช้งานได้:

1. ใช้เครื่องหมายคำพูดคู่ ( "") กับตัวแปรของคุณ

วิธีที่ง่ายที่สุดเพียงแค่ใส่เครื่องหมายคำพูดคู่ตัวแปรของคุณตามที่ระบุไว้ในคำตอบก่อนหน้านี้:

cd "$yourPathWithBlankSpace"

2. ใช้ประโยชน์จากevalไฟล์.

ตามคำตอบนี้คำสั่ง Unix เพื่อหลีกเลี่ยงช่องว่างคุณสามารถตัดช่องว่างจากนั้นใช้ประโยชน์evalดังนี้:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped

10
cd ~/My\ Code

ดูเหมือนจะใช้ได้สำหรับฉัน ... หากวางเครื่องหมายคำพูด แต่ใช้เครื่องหมายทับไม่ได้คุณสามารถโพสต์โค้ดตัวอย่างได้หรือไม่


10

คุณสามารถใช้สิ่งใดก็ได้:

cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"

คุณไม่สามารถใช้:

cd ~"/My Code"

ครั้งแรกใช้งานได้เนื่องจากเชลล์ขยาย ~ / เป็น $ HOME / จากนั้นจึงใช้งาน My Code โดยไม่มีเครื่องหมายคำพูดคู่ ข้อที่สองล้มเหลวเนื่องจากไม่มีผู้ใช้ที่เรียกว่า ' "' ( เครื่องหมายคำพูดคู่) ~"เพื่อจับคู่


4

แบ็กสแลชเดียวใช้ได้ผลสำหรับฉัน:

ry4an@ry4an-mini:~$ mkdir "My Code"

ry4an@ry4an-mini:~$ vi todir.sh

ry4an@ry4an-mini:~$ . todir.sh 

ry4an@ry4an-mini:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

คุณแน่ใจหรือไม่ว่าปัญหาไม่ใช่ว่าเชลล์สคริปต์ของคุณกำลังเปลี่ยนไดเร็กทอรีใน subshell แต่คุณกลับมาอยู่ในเชลล์หลัก (และ dir ดั้งเดิม) เมื่อทำเสร็จแล้ว? ฉันหลีกเลี่ยงสิ่งนั้นโดยใช้. เพื่อรันสคริปต์ในเชลล์ปัจจุบันแม้ว่าคนส่วนใหญ่จะใช้นามแฝงสำหรับสิ่งนี้ ช่องว่างอาจเป็นปลาชนิดหนึ่งสีแดง


ขอบคุณ Ry4an (และผู้ตอบแบบสอบถามที่เหลือ) ดูเหมือนว่าฉันเรียกใช้สคริปต์ไม่ถูกต้อง ฉันแค่พยายามเรียกใช้:% ./cdsomedir ฉันไม่รู้ว่าฉันจำเป็นต้องใช้ "." เพื่อเรียกใช้สคริปต์เหมือนที่คุณทำ:% cdsomedir.sh เมื่อฉันทำเช่นนั้นมันก็ได้ผล มือใหม่ผิดพลาด ขอบคุณ!


2

เมื่อทำงานภายใต้ Linux ไวยากรณ์ด้านล่างถูกต้อง:

cd ~/My\ Code

อย่างไรก็ตามเมื่อคุณเรียกใช้ไฟล์ให้ใช้ไวยากรณ์ด้านล่าง:

$ . cdcode

(แค่ '.' และไม่ใช่ './')


ด้วยความอยากรู้อยากเห็นทำไมมันถึงสำคัญ? ฉันเคยเห็น "./" เท่านั้นที่ใช้
whaley

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

จุด "." คือคำสั่ง unix นามแฝงสำหรับคำสั่ง "source" ควรตามด้วยชื่อไฟล์ ดังนั้น "source myfile" จะเรียกใช้ไฟล์ภายในเชลล์ปัจจุบันของคุณ และ ". myfile" จะทำเช่นเดียวกัน ตัวแปร "./" หมายถึง "ไดเรกทอรีปัจจุบัน" และไม่ใช่คำสั่ง
JPGConnolly

2

ใช้เครื่องหมายคำพูดคู่

go () 
{ 
    cd "$*"
}

ขอบคุณ. การเพิ่มฟังก์ชันใน.bashrcไฟล์ที่เป็นประโยชน์สำหรับการเปลี่ยนไดเร็กทอรีเมื่อวางชื่อไดเร็กทอรีที่มีช่องว่างลงในบรรทัดคำสั่งโดยไม่ต้องเว้นช่องว่างหรืออ้างถึงสิ่งทั้งหมด cdsเป็นชื่อที่ดีกว่าแม้ว่า
Mattst

มีวิธีใดบ้างที่จะขยายสิ่งนี้ (โดยไม่มี if) ซึ่งgoจะเทียบเท่ากับcdcd ไปยังโฮมไดเร็กทอรี
zennehoy

2

วิธีง่ายๆในการทำสิ่งนี้คือ -

 $ cd My\ Folder

ใน bash ให้เรียกใช้คำสั่ง DIR และในผลลัพธ์คุณจะเห็นว่าชื่อโฟลเดอร์หรือพา ธ ที่มีช่องว่างระหว่างพวกเขาถูกเขียนในผลลัพธ์เช่นนี้ -

$dir
My\ Folder
New\ Folder

2

สิ่งนี้จะทำ:

cd ~/My\ Code

ฉันต้องใช้มันเพื่อทำงานกับไฟล์ที่เก็บไว้ใน iCloud Drive คุณจะไม่ต้องการใช้เครื่องหมายคำพูดคู่ (") เนื่องจากต้องเป็นเส้นทางที่แน่นอนกล่าวคือคุณไม่สามารถรวมเครื่องหมายคำพูดคู่กับเครื่องหมายทิลเดอ (~) ได้

ตัวอย่างเช่นฉันต้องใช้สิ่งนี้สำหรับโครงการล่าสุด:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

ฉันหวังว่าจะช่วยได้


1

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

เพื่อสร้างลิงค์ของคุณ ln -s [เป้าหมายหรือไฟล์] ./ [SHORTCUT]

เมาหรืออาจไม่ได้ใช้งาน


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