Câu hỏi BASH Script vào cd để thư mục với dấu cách trong tên đường dẫn


Argggg. Tôi đã đấu tranh với vấn đề ngu ngốc này trong nhiều ngày và tôi không thể tìm thấy câu trả lời.

Tôi đang sử dụng BASH trên Mac OS X và tôi muốn tạo một tệp tập lệnh 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ó dấu cách trong đó. Làm thế nào bạn làm điều này? Đây là những gì tôi có ...

Tên tệp: cdcode

Nội dung tập tin: cd ~/My Code

Bây giờ được cấ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 là năm thư mục sâu và bốn trong số các thư mục đó có dấu cách trong đường dẫn.

BTW, tôi đã thử cd "~/My Code" và cd "~/My\ Code" và cả hai đều không hiệu quả.


76
2018-02-26 04:50


gốc


Tôi đang có một vấn đề tương tự như một trong những mô tả. I E. không có cách nào có thể để thay đổi một thư mục có không gian trong đó. Không có gì giống như: cd "My Passport" cd My \ Passport cd My "Passport" không có gì hoạt động. Khiếu nại hoạt động tốt. Tôi có thể liệt kê: ls -l My \ Passport / hoạt động tốt. \> uname -a máy chủ Linux 2.6.18-8.1.8.el5.centos.plus # 1 SMP Mon Jul 16 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) có ý kiến ​​nào không? - Denis C


Các câu trả lời:


Khi bạn trích dẫn kép một đường dẫn, bạn sẽ dừng mở rộng dấu ngã. Vì vậy, có một vài 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ã vẫn sẽ đượ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; điều này về cơ bản là việc mở rộng dấu ngã đang làm gì

cd ~/My\ Code

Bạn cũng có thể thoát khỏi 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.


69
2018-02-26 05:23



Bạn thậm chí có thể cd ~ / My '' Code, nhưng đó sẽ là ngớ ngẩn khi bạn có thể thoát nó bằng một dấu gạch chéo ngược thay vào đó - Nick Dixon


Chào! Tôi thấy điều này trong http://www.askdavetaylor.com/can_my_path_include_directory_names_with_spaces.html

x = "test \ me"
eval cd $ x

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


28
2018-06-13 15:52



Ý tưởng tuyệt vời. Cảm ơn. - Morten Kristensen
rõ ràng hơn: Đối với cd'ing vào thư mục của một tập tin của một kịch bản: DIR = $ (dirname "$ 0"); eval cd $ DIR - Michael Scott Cuthbert


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


7
2018-02-26 05:22





cd ~/My\ Code

dường như làm việc cho 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?


6
2018-02-26 04:55





Một dấu gạch chéo ngược duy nhất hoạt động cho 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 chắn rằng vấn đề không phải là kịch bản shell của bạn đang thay đổi thư mục trong subshell của nó, nhưng sau đó bạn quay trở lại shell chính (và dir gốc) khi hoàn thành? Tôi tránh điều đó bằng cách sử dụng. để chạy tập lệnh trong trình bao hiện tại, mặc dù hầu hết mọi người chỉ sử dụng bí danh cho điều này. Các không gian có thể là một cá trích đỏ.


4
2018-02-26 04:57



Cảm ơn, Ry4an (và những người còn lại). Có vẻ như tôi đã thực thi kịch bản không chính xác. Tôi đã cố gắng để chạy nó như vậy:% ./cdsomedir Tôi đã không nhận ra tôi cần phải sử dụng "." để chạy tập lệnh như bạn đã làm:%. cdsomedir.sh Một khi tôi đã làm điều đó, nó đã làm việc. Lỗi người mới. Cảm ơn!


Khi làm việc với 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ỉ '.' và không './')


2
2018-02-26 05:02



Ra khỏi tò mò hoang dã, tại sao điều đó lại quan trọng? Tôi đã từng thấy './'. - whaley
./ sẽ sinh ra một shell mới, và sau đó thay đổi thư mục. Vì vậy, khi kịch bản thoát ra, nó sẽ quay trở lại shell mà sinh ra shell mới ... bạn sẽ ở trong thư mục mà bạn đã thực hiện kịch bản thay vì ~ / My Code. '.' mặt khác làm cho tập lệnh được thực hiện 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ó nên được theo sau bởi một tên tập tin. Vì vậy, "nguồn myfile" sẽ chạy các tập tin trong vỏ hiện tại của bạn. Và ". Myfile" sẽ làm tương tự. Biến "./" có nghĩa là "thư mục hiện tại" và không phải là một lệnh. - JPGConnolly


Tránh ~ trong các kịch bản; sử dụng $ HOME để thay thế.


2
2018-06-10 06:06





Cách đơn giản nhất để 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 thư mục hoặc tên đườ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
2018-04-28 10:04





Sau khi đấu tranh với cùng một vấn đề, tôi đã thử hai giải pháp khác nhau hoạt động:

  • Solution1: Cách dễ nhất chỉ cần gấp đôi dấu ngoặc kép của bạn như được chỉ ra trong câu trả lời trước cd "$yourPathWithBlankSpace"
  • Giải pháp2: Theo câu trả lời này Lệnh Unix để thoát khỏi không gian bạn có thể tách không gian trống sau đó sử dụng Eval, như sau:

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


2
2017-12-03 10:43





Tôi đã có một vấn đề tương tự bây giờ là tôi đã sử dụng một kịch bản bash để đổ một số dữ liệu. Tôi đã tạo ra một liên kết tượng trưng trong thư mục kịch bản với bất kỳ khoảng trống nào trong đó. Sau đó tôi chỉ kịch bản của tôi vào 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 [MỤC TIÊU MỤC TIÊU HOẶC TẬP_TIN] ./[SHORTCUT]

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


1
2018-05-13 09:20





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

go () 
{ 
    cd "$*"
}

1
2018-05-15 15:31



Cảm ơn. Một bổ sung hữu ích cho các hàm trong một .bashrc tập tin để thay đổi thư mục khi dán tên thư mục có chứa dấu cách vào dòng lệnh mà không cần phải thoát khỏi không gian hoặc trích dẫn toàn bộ nội dung. cds là một 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ó nếu) như vậy mà chỉ go sẽ tương đương với cd, ví dụ: cd vào thư mục chính? - zennehoy