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

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

나는 알고 싶다.CD나만 홈 폴더로 보내세요CD~마찬가지인데 왜 ~를 먼저 추가하나요?

이것은 BASH에만 해당되는 것입니까, 아니면 다른 쉘에서는 다르게 동작합니까?

답변1

~용도는 여기서 끝나지 않습니다. 모든 명령은 홈 폴더에 대한 바로 가기의 이점을 누릴 수 있습니다. 그러니까 집에 CD를 넣고 싶다면 꼭 필요한 것은 아니지만, 뭐 ~/.config?

$ cd ~/.config

그렇지 않으면 기본 경로를 작성하거나 var를 사용 $HOME하거나 두 개의 cds를 수행해야 합니다. 파일을 복사하거나 이동하는 데에도 사용할 수 있습니다.

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

대부분의 파일은 집에 있으므로 항상 바로가기를 갖고 있는 것이 좋습니다.

답변2

기본적 cd 으로 cd인수 없이 호출하고 cd"...dir이 제공되지 않으면 HOME 쉘 변수의 값이 기본값입니다."배쉬 매뉴얼). 대조적으로, 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할 수 있지만 물결표 확장을 수행하기 위한 쉘 특정 구문이 있습니다 (wordexp()인용하다) C에서도 마찬가지입니다.

~표시된 이유 HOME는 이미이 문제: 옛날에는 물결표 문자가 HOMELear-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에만 해당되는 것입니까, 아니면 다른 쉘에서는 다르게 동작합니까?

아니요, 이는 일관된 행동이어야 합니다. ksh, dash및 - 모두 cshor와 동일하게 동작합니다.cdcd ~

그렇다면 처음에 ~를 추가하는 이유는 무엇일까요?

내가 말하는 것은 물결표에 대한 링크된 답변에 설명된 바와 같이 편의성과 역사적 이유입니다. 궁극적으로 이는 단순한 홈 디렉토리 확장 이상의 역할을 합니다.

답변3

몇 가지 폴더 수준 위 또는 아래에 있든 관계없이 $HOME명령 cdcd ~명령은 동일한 작업을 수행하며 아무런 차이가 없습니다. 홈 디렉터리로 돌아갑니다.

그러나 HOME보다 1개 이상의 폴더 수준에 있고 1개 이상의 폴더 수준 아래에 있는 하위 디렉터리로 직접 이동하려는 경우 $HOME,물결표( )는 명령을 입력할 ~때 인용해야 하는 텍스트를 바꾸는 데 사용할 때 키 입력을 저장하는 데 도움이 되어 유용합니다 .$HOMEcd예를 들어;

/$ 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

답변4

~는 /home/username 위치를 나타내므로 입력하는 동안 시간을 ​​절약할 수 있습니다. 예를 들어, cd /home/username/Downloads는 cd ~/Downloads와 동일하지만 입력 횟수가 적습니다. 두 명령 모두 동일한 작업을 수행합니다. 작업 디렉터리를 해당 위치로 변경합니다.

관련 정보