나는 알고 싶다.CD나만 홈 폴더로 보내세요CD~마찬가지인데 왜 ~를 먼저 추가하나요?
이것은 BASH에만 해당되는 것입니까, 아니면 다른 쉘에서는 다르게 동작합니까?
답변1
그 ~
용도는 여기서 끝나지 않습니다. 모든 명령은 홈 폴더에 대한 바로 가기의 이점을 누릴 수 있습니다. 그러니까 집에 CD를 넣고 싶다면 꼭 필요한 것은 아니지만, 뭐 ~/.config
?
$ cd ~/.config
그렇지 않으면 기본 경로를 작성하거나 var를 사용 $HOME
하거나 두 개의 cd
s를 수행해야 합니다. 파일을 복사하거나 이동하는 데에도 사용할 수 있습니다.
$ 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
는 이미이 문제: 옛날에는 물결표 문자가 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에만 해당되는 것입니까, 아니면 다른 쉘에서는 다르게 동작합니까?
아니요, 이는 일관된 행동이어야 합니다. ksh
, dash
및 - 모두 csh
or와 동일하게 동작합니다.cd
cd ~
그렇다면 처음에 ~를 추가하는 이유는 무엇일까요?
내가 말하는 것은 물결표에 대한 링크된 답변에 설명된 바와 같이 편의성과 역사적 이유입니다. 궁극적으로 이는 단순한 홈 디렉토리 확장 이상의 역할을 합니다.
답변3
몇 가지 폴더 수준 위 또는 아래에 있든 관계없이 $HOME
명령 cd
및 cd ~
명령은 동일한 작업을 수행하며 아무런 차이가 없습니다. 홈 디렉터리로 돌아갑니다.
그러나 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
답변4
~는 /home/username 위치를 나타내므로 입력하는 동안 시간을 절약할 수 있습니다. 예를 들어, cd /home/username/Downloads는 cd ~/Downloads와 동일하지만 입력 횟수가 적습니다. 두 명령 모두 동일한 작업을 수행합니다. 작업 디렉터리를 해당 위치로 변경합니다.