경로 이름에 공백이있는 디렉토리로 cd 할 Bash 스크립트


96

macOS X에서 Bash를 사용하고 있으며 실행시 다른 디렉터리로 변경되는 간단한 실행 스크립트 파일을 만들고 싶습니다. 그러나 해당 디렉토리의 경로에는 공백이 있습니다. 도대체 어떻게하는거야? 이것이 내가 가진 것입니다 ...

파일 이름 : cdcode

파일 내용 :

cd ~/My Code

이제는 긴 경로 이름은 아니지만 실제 경로 이름은 5 개의 디렉토리 깊이이고 그 중 4 개는 경로에 공백이 있습니다.

BTW, 나는 해봤 cd "~/My Code"cd "~/My\ Code"와 어느 쪽도 이들의이 일을하지 않습니다.


1
설명 된 것과 비슷한 문제가 있습니다. 즉, 공백이있는 디렉토리로 변경하는 가능한 방법이 없습니다. 다음과 같은 것이 없습니다. cd "My Passport"cd My \ Passport cd My "Passport"아무것도 작동하지 않습니다. 완성은 잘 작동합니다. 내가 나열 할 수 있습니다 : ls -l My \ Passport / 잘 작동합니다. \> uname -a 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, version 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 ~ / 내 ''코드 있지만 대신 백 슬래시를 탈출 할 때 어리석은 것
닉 딕슨

42

이 페이지에서 아래 해결책을 찾았습니다 .

x="test\ me"  
eval cd $x

(A)의 조합 \이중 인용 텍스트 상수와 eval전에 cd그것이 매력처럼 작동 만든다!


더 명확하게 : 스크립트 파일의 디렉토리로 cd'ing : DIR = $ (dirname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert 2013

1
이것은 OS X 컴퓨터에서 bash-script를 실행하는 데 정말 도움이되었습니다. 🎉
timbillstrom

여기에는 정말 필요가 없습니다 eval.
Benjamin W.

2
OS X에서는 다른 / 사전 답변을 eval.
D. Woods

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 /으로 확장 한 다음 큰 따옴표없이 내 코드를 택하기 때문에 작동합니다. 두 번째는 매핑 할 ' "'(큰 따옴표) 라는 사용자가 없기 때문에 실패 ~"합니다.


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

문제가 쉘 스크립트가 서브 쉘의 디렉토리를 변경하는 것이 아니라는 것이 확실합니까?하지만 완료되면 메인 쉘 (및 원래 디렉토리)로 돌아갑니다. 나는. 대부분의 사람들은 별칭을 사용하지만 현재 셸에서 스크립트를 실행합니다. 공간은 붉은 청어 일 수 있습니다.


감사합니다, Ry4an (및 나머지 응답자). 스크립트를 잘못 실행 한 것 같습니다. 나는 그냥 그렇게 실행하려고했다 : % ./cdsomedir 나는 "."를 사용해야한다는 것을 몰랐다. 스크립트를 실행하려면 %. cdsomedir.sh 일단 그렇게하면 작동했습니다. 초보자 실수. 감사!


2

Linux에서 작업 할 때 아래 구문이 맞습니다.

cd ~/My\ Code

그러나 파일을 실행할 때 아래 구문을 사용하십시오.

$ . cdcode

( './'가 아닌 '.')


거친 호기심에서 그게 왜 중요할까요? 나는 './'가 사용되는 것을 본 적이 있습니다.
whaley

./는 새 셸을 생성 한 다음 디렉토리를 변경합니다. 따라서 스크립트가 종료되면 새 셸을 생성 한 셸로 돌아갑니다. ~ / My Code 대신 스크립트를 실행 한 디렉토리에있게됩니다. '.' 반면에 스크립트는 현재 쉘 인스턴스에서 실행됩니다.
Alterlife

점 "." "source"명령의 별명 인 unix 명령입니다. 그 뒤에 파일 이름이 와야합니다. 따라서 "source myfile"은 현재 셸 내에서 파일을 실행합니다. 그리고 ". myfile"도 마찬가지입니다. "./"변수는 "현재 디렉토리"를 의미하며 명령이 아닙니다.
JPGConnolly

2

큰 따옴표 사용

go () 
{ 
    cd "$*"
}

감사. .bashrc공백을 이스케이프하거나 전체를 인용 할 필요없이 명령 줄에 공백이 포함 된 디렉토리 이름을 붙여 넣을 때 디렉토리를 변경하기위한 파일 의 기능에 유용한 추가 기능입니다 . cds그래도 더 나은 이름입니다.
mattst 2016

이것을 확장하는 방법이 있습니까 (if없이) , 즉, 홈 디렉토리로 cd go와 동일하게 될 것 cd입니까?
zennehoy

2

이렇게하는 아주 간단한 방법은

 $ cd My\ Folder

bash에서 DIR 명령을 실행하면 결과에서 그 사이에 공백이있는 폴더 또는 경로 이름이 다음과 같은 결과에 기록 된 것을 볼 수 있습니다.

$dir
My\ Folder
New\ Folder

2

이렇게하면됩니다.

cd ~/My\ Code

아이 클라우드 드라이브에 저장된 파일로 작업하기 위해 그것을 사용해야했다. 절대 경로 여야하므로 큰 따옴표 ( ")를 사용하지 않을 것입니다. 즉, 큰 따옴표를 물결표 (~)와 결합 할 수 없습니다.

예를 들어 최근 프로젝트에서 이것을 사용해야했습니다.

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

도움이 되었기를 바랍니다.


1

나는 bash 스크립트를 사용하여 일부 데이터를 덤프하는 것과 비슷한 문제가 발생했습니다. 결국 공백이없는 스크립트 폴더에 심볼릭 링크를 만들었습니다. 그런 다음 스크립트를 심볼릭 링크로 지정했는데 제대로 작동합니다.

링크를 만들려면. ln -s [대상 디렉토리 또는 파일] ./[SHORTCUT]

Mau 또는 사용하지 않을 수 있습니다.


1

다음과 같이 작은 따옴표를 사용합니다.

myPath=~/'my dir'

cd $myPath
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.