$ HOME과 ~의 차이점


답변:


45

모두 $HOME~동일한 폴더, 현재 사용자의 홈 폴더를 가리키고 있지만, 둘 다 매우 다른 것입니다.

  • $HOME입니다 환경 변수 현재 사용자의 홈 폴더를 포함하도록 설정되어 있습니다.
  • ~A는 쉘 확장 기호 , 즉 실제 명령이 수행되기 전에 처리되는 심볼 중 하나. ~단독으로 $ HOME의 값으로 확장됩니다. ~nemouser의 홈 디렉토리로 확장됩니다 nemo. 쉘 확장 기호는 실제 명령을 빌드하기 위해 쉘이 처리 / 해석하는 문자 (또는 문자 쌍)입니다. 쉘 확장 기호의 다른 예는 *파일 이름을 확장하는 데 사용됩니다.

1
~Windows에서는 $ HOME 또는 % APPDATA %로 확장됩니다. 정의되지 않은 경우 "암호 데이터베이스"에서 경로를 찾습니다 (일반적으로을 의미 /etc/passwd하지만 LDAP 또는 기타 데이터 소스 일 수 있음). 약 20 년 전에 어떤 머신에서는 $ HOME이 설정되지 않았을 수도 있지만 어떤 ~것으로 확장 될 수 있다는 경고를 받았을 수도 있습니다 .
Mirek Długosz

이 차이는 make와 같은 프로그램에서 두드러집니다. 필요한 두 가지 중 하나를 알아야 할 때
D. Ben Knoble

3
@ MirekDługosz에 적어도 자식 bash는 Windows에서, ~이 확장은 $HOME(동일 $HOMEPATH하지) $APPDATA. 그리고 cmd.exe에서는 ~확장되지 않습니다.
하이드

1
@vanadium HOME은 쉘 변수가 아닌 환경 변수 (OS 개념, 예를 들어 또는로 설정 한 sh 쉘에서 )이며 쉘의 정의는 쉘에 전적으로 의존하지만 sh 쉘에서는 일반적으로 다른 쉘 과 함께 또는 다른 것으로 설정됩니다. 방법). exportdeclare -xfoo=valueset
하이드

1
@ 하이드 내가 잘못 말 했어요. bash는 $ HOME을 확인하고 설정되지 않은 경우 % APPDATA %를 확인하지만 Windows에서만 확인합니다. 설정되어 있지 않으면 "비밀번호 데이터베이스"를 찾습니다. 참조 git.savannah.gnu.org/cgit/bash.git/tree/lib/readline/...
미렉 Długosz

17

그것들이 다른 한 가지 방법은 Bash 쉘 "이 따옴표로 묶여있을 때 어떻게 변환하는지 입니다.

당신이 사용하는 경우 echo다음, 어떤 따옴표없이, 같은 ~$HOME같은 효과를 :

$ echo ~
/home/elias
$ echo $HOME
/home/elias

그러나 "주위에 따옴표가 있으면 결과가 다릅니다.

$ echo "~"
~
$ echo "$HOME"
/home/elias

13

~정의상 단어의 시작 부분에서 시작해야하는 물결표 접두사 의 일부로 만 확장됩니다 . 또한 한 번 globbing 패턴의 일부 였으므로 ~큰 따옴표 안에 작동하지 않습니다. 그래서, "~"또는 a~b의 리터럴 값 발생합니다 ~보존된다.

단일 ~(또는 ~뒤에 /)은 현재 사용자의 집으로 확장됩니다.

$ echo ~/.ssh
/home/user/.ssh

A는 ~해당 사용자의 홈 폴더로 확장하는 사용자 이름 뒤에 :

$ echo ~root/.ssh
/root/.ssh

A는 ~a로 다음 +또는 -및 옵션 수는 요소로 확장됩니다 디렉토리 스택 :

$ cd /etc
$ echo ~+0
/etc

$HOME~변수의 구문 규칙을 따르는 single 과 같습니다. 예를 들어, 큰 따옴표로 확장하고 설정을 해제 할 수 있으며 문자열 조작 피연산자 를 적용 할 수 있습니다.


3

이것은 확장이 무엇인지에 달려 있습니다. bash에서는 ~인용되지 않은 경우에도 파일 이름 확장 또는 단어 분할을 트리거하지 않고 홈 디렉토리를 얻는 편리한 방법입니다. 예를 들면 다음과 같습니다.

$ HOME='/*'
$ echo $HOME
/bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
$ echo ~
/*

또는:

$ HOME='/ a b'
$ printf "|%s|\n" $HOME ~
|/|
|a|
|b|
|/ a b|

따라서 어떤 이유로 든 따옴표로 씨름하는 경우 (이 경우 실제로 모든 것을 다시 생각하면 돼지를 씨름하는 것이 더 쉽습니다) ~더 편리 할 수 ​​있습니다.


한편, 파이썬, 예를 들어, ~$HOME에 의해 확장 될 필요가 다른 기능 . 다른 곳에서는 변수를 허용하고 와일드 카드 나 물결표 확장 (예 : ~/.pam_environment변수 확장을위한 특수 구문이있는) 과 같은 다른 쉘 구문을 허용하지 않습니다 . 다른 곳에서는 물결표 확장을 예외 (예 : systemd ) 로 허용 하지만를 사용하는 대신 passwd 데이터베이스를 직접 쿼리하십시오 $HOME.


여기에 표시하지만 언급하지 않은 또 다른 큰 차이점은의 값은 변경할 $HOME수 있지만 의 값은 (직접) 변경할 수 없다는 것입니다 ~.

내가 않을 때 물어 그래서 $HOME~그들은 보통 기본적으로 수행 - - 같은 일을 참조하지 다음은 환경 변수에 의도적으로 할당 그들이 같은 일을 참조 할 수 있도록합니다. 이것은 좋은 데모이지만 불필요하게 혼란 스럽습니다.
H2ONaCl

1

물결표 확장은 BSD csh tcsh GNU bash 및 기타에서 발견되는 확장이므로 $ HOME /은 표준 POSIX.2 Bourne / bin / sh에서 작동 할 가능성이 높습니다.

busybox 또는 dash 또는 BSD sh에 이식 가능한 스크립트를 작성하려면 ~ /와 충돌하지 않도록 추가 문자에 투자하십시오. 특정 시스템에는 해당 파일이나 디렉토리가 없습니다.

또한 $ HOME /이 더 읽기 쉽습니다.


스크립트에서 가독성과 가시성이 중요합니다. 아마도 이것이 내 스크립트가 $HOME거의 사용하지 않는 이유 일 것 ~입니다. 내 자신은 아마 이것을 알고 있었다.
H2ONaCl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.