'cd'와 'cd ~'의 차이점


10

만약 내가 궁금 CD 혼자 내 홈 폴더에 저를 보내고 CD가 ~ 왜 ~ 그 첫 번째 장소에서 동일 하였다는 무엇입니까?

BASH에만 해당됩니까, 아니면 다른 Shell에서 다르게 동작합니까?


2
확실히 중복되지 않습니다. 그 질문은 cd ~vs cd $HOMEvs 에 대해 묻고 cd ~not-tandu있습니다. 이 질문은 cdvs 에 대해 묻고 cd ~있습니다.

답변:


17

~더 단지보다 사용할 수 있습니다. 모든 명령은 홈 폴더 바로 가기를 사용하여 이익을 얻을 수 있습니다. 따라서 집에 들어가려면 필요하지 않지만 어떻 ~/.config습니까?

$ cd ~/.config

그렇지 않으면 홈 경로를 작성 $HOME하거나 var를 사용 하거나 두 가지를 수행해야 cd합니다. 또한 파일 복사 또는 이동의 경우 :

$ cp ~/downloads/some-file some/path/

대부분의 파일은 집에 있기 때문에 항상 지름길을 갖는 것이 좋습니다.


안녕하십니까, 실제로 내 질문은 왜 두 가지 방법에 더 중점을 둡니다. 나는 이미 $ HOME 변수를 사용하는 것에 대해 알고 있지만 이것을 염두에두고 왜 "CD"만으로 나를 집으로 보내는가? 같은 목적으로 두 가지 방법이 필요한 이유는 무엇입니까?
루이스 알바라도

4
@CYREX 내 추측은 홈 디렉토리로 이동하려는 일반적인 경우에 대한 입력을 저장하는 것입니다.
CVn

1
의 다른 사용 ~하는 것입니다 cd ~user/download사용자의 다운로드 디렉토리로 이동합니다.
ott--

5

이렇게 cd 기본적으로 호출 cd인수없이 및에 따라 cd행동 "디렉토리가 제공되지 않는 경우 ... 홈 쉘 변수의 값은 기본값입니다." ( bash 매뉴얼에서 ). 반대로, 명령에 cd ~인수를 제공하면 셸이 물결 확장 을 수행 합니다. 사용자의 홈 디렉토리로 돌아가는 한 차이는 없습니다. 두 경우 모두 환경 변수가 쿼리됩니다.cd~HOME

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

실제로 이것은 와도 차이가 없습니다 cd $HOME. 그러나 cd하나의 작업 만 수행 하지만 물결표를 사용하여 ~+현재 작업 디렉토리 와 같은 다른 확장을 수행 할 수 있습니다 .

그러나 흥미롭게도 우리는 unset HOME깰 수 는 cd있지만 ~여전히 작동합니다.

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

왜 ? 다시 매뉴얼에 대답하십시오.

HOME이 설정되어 있지 않으면 쉘을 실행하는 사용자의 홈 디렉토리가 대신 사용됩니다. 그렇지 않으면 물결표 접두어가 지정된 로그인 이름과 연관된 홈 디렉토리로 바뀝니다.

설정 해제는 빈 변수를 만드는 것과 다르며 HOME=효과가 있습니다. 문서는 특히 변수 설정 해제에 대해 설명합니다. 변수를 빈 문자열과 동일하게 만드는 것은 우리가 기대하는 것과 반대의 영향을 미칩니다.

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

여기서 HOME빈 문자열 을 만들면 물결표와 cd동작 이 모두 끊어짐 을 알 수 있습니다 .


물결과 $HOME존재의 차이와 다른 이유가 있습니다. $HOME셸 변수는 환경 변수 중 하나 인 동시에 발생하며 모든 프로그램에서 사용할 수 있습니다. C에서는 environ()액세스하는 데 사용합니다. 대조적으로, tilde틸드 확장을 수행하는 쉘 특정 구문이지만 C에서도 wordexp()쉘과 같은 확장 ( reference ) 을 수행 하는 함수를 사용할 수 있습니다 .

이 질문 에서 왜 ~대표 하는가에 대한HOME 있었습니다. 물결표 문자 HOME는 Lear-Siegler ADM-3A 터미널에서 같은 키를 공유했습니다 . HOME대조적으로 순전히 상징적 인 의미를 갖고 물리적 표현이없는 환경 변수입니다.

또한 HOME환경 변수 라는 사실을 통해 설정을 해제 할 수 있습니다. 여기서 ~간단한 수단으로는 다른 것으로 설정할 수 없습니다 .

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

처음 echo에는 설정되지 않은 변수를 출력 하는 빈 줄 과 그 사실을 주목하십시오 . 대조적으로, 우리는 이와 같은 것을 틸드 할 수 없습니다 :

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

그러나 변경하면 다음에 HOME영향을 미칩니다 ~.

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

또한 ~확장 문자로도 작동 하므로 다음 과 같이 현재 작업 디렉토리를 표시 할 수 있습니다.

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

우리가 환경 변수를 통해 그렇게 할 경우 반면에, 우리는 필요 PWD하고, HOME동일하게 유지, 또는 당신이 좋아하는 일을 할 경우 echo $HOME+- 그것은 단지 문자열 / 변수 연결합니다. 그러나 다시, ~+환경 변수에서 정보를 가져옵니다.

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

참고 : ~+~-확장은 작동 ksh하지만 작동 하지 않습니다 dash.


특정 질문에 대한 답변 :

BASH에만 해당됩니까, 아니면 다른 Shell에서 다르게 동작합니까?

아니요, 일관된 동작이어야합니다. ksh, dash,와 csh-와 같은 모든 행동하라 cdcd ~.

왜 ~가 처음에 추가 되었습니까?

물결표에 대한 링크 된 답변에서 설명 된 편의성과 역사적인 이유를 말하고 싶습니다. 결국 홈 디렉토리 확장 이상의 기능을 수행하게되었습니다.


0

위 또는 아래의 여러 폴더 수준에 관계없이 $HOME명령 cdcd ~동일한 작업을 수행하고 다르지 않습니다. 다시 HOME 디렉토리로 보내집니다.

그러나이 : 당신이 집에 위의 1 명 이상의 폴더 수준이고, 당신은 하위 디렉토리 1 이하 더 폴더 수준으로 직접 이동하려는 경우 $HOME, 틸드는 ( ~)를 참조하는 데 필요한 텍스트를 대체하는 데 사용되는 때를 키 입력을 저장하여 편리 명령을 $HOME입력 할 때 cd예를 들어;

/$ cd    # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3    # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3

0

~는 / home / username 위치를 나타내므로 입력시 시간이 절약됩니다. 예를 들어 cd / home / username / Downloads는 cd ~ / Downloads와 동일하지만 입력이 적습니다. 두 명령 모두 동일하게 작업 디렉토리를 해당 위치로 변경합니다.


실제로는 아닙니다. 예 root홈 디렉토리 외부 보통/home
드미트리 Grigoryev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.