Bash script thành cd đến thư mục có khoảng trắng trong tên đường dẫn


95

Tôi đang sử dụng Bash trên macOS X và tôi muốn tạo một tệp kịch bản thực thi đơn giản có thể thay đổi thành thư mục khác khi nó chạy. Tuy nhiên, đường dẫn đến thư mục đó có khoảng trắng trong đó. Làm thế quái nào mà bạn làm được điều này? Đây là những gì tôi có ...

Tên tệp: cdcode

Nội dung tệp:

cd ~/My Code

Bây giờ đã được cấp phép, đây không phải là một tên đường dẫn dài, nhưng tên đường dẫn thực tế của tôi có sâu năm thư mục và bốn trong số các thư mục đó có khoảng trắng trong đường dẫn.

BTW, tôi đã thử cd "~/My Code"cd "~/My\ Code" và không ai trong số những tác dụng.


1
Tôi đang gặp sự cố tương tự như sự cố được mô tả. Tức là không có cách nào có thể để thay đổi một thư mục mà có một khoảng trống trong đó. Không có gì giống như: cd "Hộ chiếu của tôi" cd Hộ chiếu của tôi cd "Hộ chiếu" của tôi không hoạt động. Lời khen hoạt động tốt. Tôi có thể liệt kê: ls -l My \ Passport / hoạt động tốt. \> uname -a Linux host 2.6.18-8.1.8.el5.centos.plus # 1 SMP Thứ Hai, ngày 16 tháng 7, 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash, phiên bản 3.1 .17 (1) -release- (i686-redhat-linux-gnu) bất kỳ ý tưởng xin vui lòng?
Denis C

Câu trả lời:


81

Khi bạn trích dẫn kép một đường dẫn, bạn đang dừng việc mở rộng dấu ngã. Vì vậy, có một số cách để làm điều này:

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

Dấu ngã không được trích dẫn ở đây, vì vậy việc mở rộng dấu ngã sẽ vẫn được chạy.

cd "$HOME/My Code"

Bạn có thể mở rộng các biến môi trường bên trong các chuỗi được trích dẫn kép; về cơ bản đây là những gì mở rộng dấu ngã đang làm

cd ~/My\ Code

Bạn cũng có thể thoát các ký tự đặc biệt (chẳng hạn như dấu cách) bằng dấu gạch chéo ngược.


3
Bạn thậm chí có thể cd ~ / của tôi' 'Mã, nhưng đó sẽ là ngớ ngẩn khi bạn có thể thoát khỏi nó với một dấu gạch chéo thay vì
Nick Dixon

41

Tôi tìm thấy giải pháp bên dưới trên trang này :

x="test\ me"  
eval cd $x

Sự kết hợp của \một hằng số trong văn bản được trích dẫn kép và một evaltrước cdlàm cho nó hoạt động như một sự quyến rũ!


rõ ràng hơn: Đối với cd'ing đến thư mục của một tệp của một tập lệnh: DIR = $ (dirname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert

1
Điều này thực sự giúp ích cho tôi khi chạy tập lệnh bash trên máy OS X. 🎉
timbillstrom 21/09/18

Thực sự không cần thiết evalở đây.
Benjamin W.

2
Trên OS X, tôi không thể nhận được các câu trả lời khác / trước để hoạt động mà không có eval.
D. Woods

10
cd ~/My\ Code

dường như hiệu quả với tôi ... Nếu bỏ dấu ngoặc kép nhưng giữ dấu gạch chéo không hoạt động, bạn có thể đăng một số mã mẫu không?


10

Bạn có thể sử dụng bất kỳ:

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

Bạn không thể sử dụng:

cd ~"/My Code"

Cách đầu tiên hoạt động vì trình bao mở rộng ~ / thành $ HOME /, và sau đó gắn vào Mã của tôi mà không có dấu ngoặc kép. Cách thứ hai không thành công vì không có người dùng được gọi là ' "' (dấu ngoặc kép) ~"để ánh xạ tới.


9

Sau khi vật lộn với cùng một vấn đề, tôi đã thử hai giải pháp khác nhau có hiệu quả:

1. Sử dụng dấu ngoặc kép ( "") với các biến của bạn.

Cách dễ nhất chỉ cần trích dẫn kép các biến của bạn như đã chỉ ra trong câu trả lời trước:

cd "$yourPathWithBlankSpace"

2. Tận dụng eval .

Theo câu trả lời này, lệnh Unix để thoát khỏi khoảng trắng, bạn có thể loại bỏ khoảng trống sau đó sử dụng eval, như sau:

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

4

Một dấu gạch chéo ngược phù hợp với tôi:

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

Bạn có chắc vấn đề không phải là tập lệnh shell của bạn đang thay đổi thư mục trong vỏ con của nó, nhưng sau đó bạn quay lại shell chính (và dir gốc) khi hoàn tất? Tôi đã tránh điều đó bằng cách sử dụng. để chạy script trong shell hiện tại, mặc dù hầu hết mọi người sẽ chỉ sử dụng một bí danh cho việc này. Khoảng trống có thể là một con cá trích đỏ.


Cảm ơn, Ry4an (và những người còn lại). Có vẻ như tôi đã thực thi tập lệnh không chính xác. Tôi chỉ đang cố gắng chạy nó như vậy:% ./cdsomedir Tôi không nhận ra mình cần sử dụng dấu "." để chạy tập lệnh như bạn đã làm:%. cdsomedir.sh Khi tôi đã làm điều đó, nó đã hoạt động. Sai lầm của người mới. Cảm ơn!


2

Khi làm việc trong Linux, cú pháp bên dưới là đúng:

cd ~/My\ Code

Tuy nhiên, khi bạn đang thực thi tệp của mình, hãy sử dụng cú pháp bên dưới:

$ . cdcode

(chỉ '.' chứ không phải './')


Vì tò mò hoang dã, tại sao điều đó lại quan trọng? Tôi chỉ từng thấy './' được sử dụng.
whaley

./ sẽ sinh ra một trình bao mới và sau đó thay đổi thư mục. Vì vậy, khi tập lệnh thoát ra, nó quay trở lại trình bao đã sinh ra trình bao mới ... bạn sẽ ở trong thư mục nơi bạn đã thực thi tập lệnh thay vì ~ / My Code. '.' mặt khác làm cho tập lệnh được thực thi trong phiên bản hiện tại của trình bao.
Alterlife

Dấu chấm "." là một lệnh unix, một bí danh cho lệnh "nguồn". Nó phải được theo sau bởi một tên tệp. Vì vậy, "source myfile" sẽ chạy tệp trong trình bao hiện tại của bạn. Và ". Myfile" cũng sẽ làm như vậy. Biến "./" có nghĩa là "thư mục hiện tại" và không phải là lệnh.
JPGConnolly

2

sử dụng dấu ngoặc kép

go () 
{ 
    cd "$*"
}

Cảm ơn. Một bổ sung hữu ích cho các chức năng trong .bashrctệp để thay đổi thư mục khi dán tên thư mục chứa khoảng trắng vào dòng lệnh mà không cần phải thoát khỏi khoảng trắng hoặc trích dẫn toàn bộ. cdslà một cái tên tốt hơn mặc dù.
mattst

Có cách nào để mở rộng điều này (không có if) để chỉ gotương đương với cd, tức là, cd vào thư mục chính?
zennehoy

2

Cách rất đơn giản để làm điều này là-

 $ cd My\ Folder

Trong bash, chạy lệnh DIR và trong kết quả, bạn sẽ thấy rằng các tên thư mục hoặc đường dẫn có khoảng cách giữa chúng đã được viết trong các kết quả như thế này:

$dir
My\ Folder
New\ Folder

2

Điều này sẽ làm điều đó:

cd ~/My\ Code

Tôi đã phải sử dụng nó để làm việc với các tệp được lưu trữ trong iCloud Drive. Bạn sẽ không muốn sử dụng dấu ngoặc kép (") vì nó phải là một đường dẫn tuyệt đối. Nói cách khác, bạn không thể kết hợp dấu ngoặc kép với dấu ngã (~).

Ví dụ, tôi phải sử dụng điều này cho một dự án gần đây:

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

Tôi hy vọng rằng sẽ giúp.


1

Tôi đã gặp vấn đề tương tự bây giờ là tôi đang sử dụng tập lệnh bash để kết xuất một số dữ liệu. Tôi đã kết thúc việc tạo một liên kết tượng trưng trong thư mục script mà không có bất kỳ khoảng trắng nào trong đó. Sau đó, tôi đã trỏ tập lệnh của mình đến liên kết tượng trưng và nó hoạt động tốt.

Để tạo liên kết của bạn. ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]

Mau hoặc có thể không sử dụng.


0

Sử dụng các dấu ngoặc kép, như:

myPath=~/'my dir'

cd $myPath
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.