"cd-"와 "cd ~-"의 차이점


56

배쉬 명령

cd - 

이전에 사용한 디렉토리를 인쇄하고 변경합니다.

반면에 Bash 명령

cd ~-

아무것도 에코하지 않고 이전에 사용한 디렉토리로 직접 변경합니다.

그게 유일한 차이점인가요? 각 명령의 사용 사례는 무엇입니까?


3
이 까다로운 것을 사용하지 않는 것이 좋습니다. 이것은 당신의 두뇌입니다 cd ~-.
DepressedDaniel

10
@DepressedDaniel, 까다로운 것을 사용하지 않더라도 (뒤로) 계획이 뒤 따르는 일을 이해하는 것이 여전히 유용합니다. 코너 케이스를 이해하면 나중에 다른 무언가를 디버깅하려고 할 때 구멍에서 벗어날 수 있습니다.
anotherdave

답변:


81

여기에는 두 가지가 있습니다. 먼저, -단독 디렉토리가 이전 디렉토리로 확장됩니다. 이것은 (강조 광산) cd섹션에 설명되어 있습니다 man bash.

-디렉토리 변경을 시도하기 전에 인수 가 $ OLDPWD로 변환됩니다. CDPATH의 비어 있지 않은 디렉토리 이름이 사용되거나 -첫 번째 인수 인 경우 디렉토리 변경에 성공하면 새 작업 디렉토리의 절대 경로 이름이 표준 출력에 기록됩니다. 디렉토리가 성공적으로 변경되면 리턴 값은 true입니다. 그렇지 않으면 거짓.

따라서 간단 cd -하게 이전 디렉토리로 이동하여 디렉토리 이름을 인쇄합니다. 다른 명령은 "틸드 확장"섹션에 설명되어 있습니다.

물결표 접두사가 a ~+이면 쉘 변수 PWD의 값이 물결표 접 두부를 대체합니다. 물결표 접두어가 a ~-이면 쉘 변수 OLDPWD의 값이 설정되어 있으면이를 대체합니다. 물결표 접두어에서 물결표 뒤에 오는 문자가 선택적으로 a +또는 a 접두어로 숫자 N으로 구성되는 -경우 물결표 접두어는 디렉토리 스택의 해당 요소로 대체됩니다. 물결표 접두어를 인수로 사용합니다. 물결표 접두사의 물결을 다음과 같은 문자가 선도적없이 숫자로 구성되어있는 경우 +-, +가정한다.

예를 들어 이해하기가 더 쉬울 수 있습니다.

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

따라서 일반적으로 -"이전 디렉토리"를 의미합니다. 그렇기 때문에 cd -그 자체로 당신이있는 곳으로 다시 돌아갈 수 있습니다.

가장 큰 차이점은 내장 cd -에 따라 cd다릅니다. 시도하면을 echo -인쇄합니다 -. 이 ~-물결표 확장 기능의 일부이며 변수와 유사하게 작동합니다. 그래서 echo ~-의미있는 것을 얻을 수 있습니다 . 또한 사용할 수도 cd ~-있지만 다른 명령에서도 사용할 수 있습니다. 예를 들어 cp ~-/* .에 해당 될 것이다cp "$OLDPWD"/* .


1
set -x확장 된 명령을 실행하기 전에 인쇄하면 차이를 설명하는 데 유용 할 수 있습니다 (또는 한 번에 한 단계 씩 직접 수행하지 않을 경우 읽기가 어려울 수 있음).
Peter Cordes

1
@ terdon 오늘 나는 배웠다.
sitilge

요컨대 ... cd ~-/..작품, cd -/..하지 않습니다!
레이 포스

13

~-틸드 확장이 적용되므로 (man bash 참조) cd이전 디렉토리 이름이 바로 표시됩니다. -쉘에 의해 확장되지 않고 cd직접보고 문서화 된 것처럼 작동합니다.

-의 인수는 $ OLDPWD와 같습니다. CDPATH에서 비어 있지 않은 디렉토리 이름을 사용하거나-가 첫 번째 인수이고 디렉토리 변경에 성공하면 새 작업 디렉토리의 절대 경로 이름이 표준 출력에 기록됩니다.


4

TL; DR은 : cd -에 내장되어 cd, ~-이후 확장 ~[name], 특정하지 cd.

POSIX.1-2008 Shell & Utilities 는 다음 명령관련된cd - 특수한 경우로 정의합니다 .cd

a를 -피연산자로 사용하는 경우 다음 명령과 같습니다.

cd "$OLDPWD" && pwd

이전 작업 디렉토리로 변경 한 다음 이름을 씁니다.

~-확장에 확장됩니다 $OLDPWD모든 명령이 실행되기 전에뿐 아니라 모든 명령에 대한 인수로 전달 될 수있다 cd. 의 이후 확장입니다 .

앞에서 언급 한 POSIX.1-2008 Shell & Utilities 표준에도 Tilde Expansion에 대한 자세한 설명이 있습니다. 문구는 ~-표준 범위 내에서 정의되지 않은 동작 으로 허용하기 위해 매우 구체적 입니다. 여기서 빈 문자열 인 경우 를 나타내 거나 유효한 사용자 이름 인 경우 사용자의 홈 디렉토리를 ~[name]나타냅니다 .$HOME[name]namename

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