답변:
는 ~
더 단지보다 사용할 수 있습니다. 모든 명령은 홈 폴더 바로 가기를 사용하여 이익을 얻을 수 있습니다. 따라서 집에 들어가려면 필요하지 않지만 어떻 ~/.config
습니까?
$ cd ~/.config
그렇지 않으면 홈 경로를 작성 $HOME
하거나 var를 사용 하거나 두 가지를 수행해야 cd
합니다. 또한 파일 복사 또는 이동의 경우 :
$ cp ~/downloads/some-file some/path/
대부분의 파일은 집에 있기 때문에 항상 지름길을 갖는 것이 좋습니다.
~
하는 것입니다 cd ~user/download
사용자의 다운로드 디렉토리로 이동합니다.
이렇게 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
-와 같은 모든 행동하라 cd
나 cd ~
.
왜 ~가 처음에 추가 되었습니까?
물결표에 대한 링크 된 답변에서 설명 된 편의성과 역사적인 이유를 말하고 싶습니다. 결국 홈 디렉토리 확장 이상의 기능을 수행하게되었습니다.
위 또는 아래의 여러 폴더 수준에 관계없이 $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
~는 / home / username 위치를 나타내므로 입력시 시간이 절약됩니다. 예를 들어 cd / home / username / Downloads는 cd ~ / Downloads와 동일하지만 입력이 적습니다. 두 명령 모두 동일하게 작업 디렉토리를 해당 위치로 변경합니다.
root
홈 디렉토리 외부 보통/home
cd ~
vscd $HOME
vs 에 대해 묻고cd ~not-tandu
있습니다. 이 질문은cd
vs 에 대해 묻고cd ~
있습니다.