home$과 ~$의 차이점은 무엇인가요?

home$과 ~$의 차이점은 무엇인가요?

아래 스크린샷에서는 이해가 되지 않습니다.제삼지름길표 2-1.

cd ~user_name작업 디렉터리가 홈 디렉터리로 변경된다고 합니다 .사용자 이름. 하지만 이 명령을 입력하면 동일한 디렉터리에 있습니다.~$그리고 거기엔 없어/집$. 왜?

모두 똑같나요?

공식적인 것은 사용자 디렉터리이고 후자는 홈 디렉터리인 것 같습니다.

스크린샷

답변1

당신이 무슨 말을 하든~$,집$, 그리고/집$ 별 의미가 없습니다. 명령줄 프롬프트에 대해 이야기하고 있는 것 같습니다. 그렇다면 입력한 내용과 발생한 내용을 표시한 다음 예상한 내용을 설명하는 것이 유용할 것입니다.

하지만 나는 마음을 읽을 수 있으므로 다음 질문을 이해한다고 믿습니다. ~그리고~사용자 239887(그렇다고 가정 user239887하면당신의실제 사용자 이름)은 동일한 의미를 갖습니다. 들어가고 싶다면

cd ~gman

그게 널 거기로 데려갈 거야내 거홈 디렉토리, 쉘 프롬프트는 다음과 같습니다./home/gman$.


처음에 쉘 프롬프트는 항상 인쇄 문자와 공백의 두 문자입니다. 시스템 관리자인 경우 프롬프트는 " "이고, 그렇지 않은 경우 " " 또는 " " 입니다 . 그런 다음 하나님은 "아름다운 쉘 프롬프트가 있게 하라"고 말씀하셨고, 짜잔, 아름다운 쉘 프롬프트가 있었습니다. 쉘 프롬프트는 사용자 이름, 시스템 이름, 시간, 달의 위상(농담이라고 생각하시나요?)을 모두 색상으로 표시하기 시작합니다.

쉘 프롬프트에 대한 가장 널리 사용되는 사용자 정의 중 하나는 현재 디렉토리를 포함하는 것입니다. 쉘 프롬프트는 아마도 현재 디렉토리 뒤에 "".

다른멋진 것™에는 "를 입력하여 자신만의 홈 디렉터리를 지정할 수 있습니다.~따라서 현재 디렉토리가 홈 디렉토리이고 쉘 프롬프트가 현재 디렉토리를 표시하도록 구성된 경우 쉘 프롬프트는 "~". 그러나 다른 곳에서는 실제 경로 이름을 표시합니다(표시되지 않는 한 "~gman"당신이 언제내 거기본 디렉토리, /home/gman).

당신의홈 디렉토리는 /home/user239887이전에 말했듯이 .~또는~사용자 239887. 로그인하면 홈 디렉토리에 있으므로 프롬프트는 "~$ ". 입력하면cd ../home, 그런 다음 디렉토리 로 이동합니다 .부모홈 디렉토리의 디렉토리와 프롬프트가 "/home$ ".

같은 말을 반복할 위험을 무릅쓰고,아니요, /home홈 디렉토리가 아닙니다. 귀하의 홈 디렉토리 는 /home/user239887.  /home부모홈 디렉터리의 디렉터리입니다.

답변2

사용자가 로그인하면 $HOME일반적으로 환경 변수가 설정되어 login사용자 홈 디렉터리의 경로 이름으로 내보내집니다. POSIX 호환 쉘은 다음 작업을 수행해야 할 때 컨텍스트에서 이 환경 변수의 값을 사용합니다.~ 틸데확장하여 사용자의 홈 디렉터리 경로를 완성하지만 실제 확장 필드는 비어 있습니다. 쉘과의 연관성 외에도틸데다른 경우에는 확장 및 /bin/login쉘 변수에 대한 예외가 없습니다. 이는 다른 쉘 변수와 마찬가지로 쉘에 의해 처리됩니다. $HOME껍데기틸데그러나 확장은 쉘 확장이 거의 모든 것에 적용된다는 점에서 독특합니다.

처음에는 이해하기가 조금 어렵습니다. 아마도 이것이 이유일 것입니다.틸데보다 일반적인 유형에 부정적인 영향을 미치는 경향이 있는 여러 유형의 셸 확장 취약점에 면역이지만 그 사용은 충분히 활용되지 않습니다.

쉘은 휴대용을 고려할 수 있습니다틸데다음 조건 중 하나에 해당하는 경우 확장을 받을 수 있습니다.

  1. =쉘 변수 할당에서 첫 번째 또는 콜론 문자 바로 뒤.
  2. 쉘 매개변수 번호를 시작하십시오.
  3. 셸 경로를 시작하고 올바르게 구분된 하나 이상의 완전한 경로 구성 요소를 단독으로 완료하거나 후행 컨텍스트를 사용하여 확인할 수 있습니다.

이러한 경우에도~ 틸데~ 할 것이다아니요참조되거나 컨텍스트가 어떻게든 확장을 방해하는 경우 확장될 수 있습니다.완전히일부 사용자의 홈 디렉터리 또는 환경 변수의 현재 값입니다 $HOME. 다시 말하면 껍질은~하지 않을 것이다어떤 일이든 수행하다틸데확장의 맥락이 완전히 불확실한 경우 확장하십시오. 쉘은 null로 확장되지만 $var_not_var매번 유사한 추측을 거부합니다 ~.

$HOME예를 들어 교체는 다음과 같은 상황에서만 발생할 수 있습니다.틸데의 가능한 확장 필드는 null입니다. 즉, 매개변수 목록에서의 해당 위치는 모든 측면에서 구분되어 있기 때문에 확장 적격성을 명확하게 보장합니다.

유일한 다른 경우는틸데후행 컨텍스트가 인증된 시스템 사용자 이름과 정확히 일치하면 확장될 수 있습니다. 이 경우 해당 사용자의 할당된 홈 디렉터리에 대한 시스템 보고 경로로 대체됩니다. 쉘은 컨텍스트를 시스템에 등록된 사용자 목록과 비교해야 합니다.오직후행 컨텍스트가 다음 중 하나와 일치하면 확장합니다.

내가 의미하는 바를 명확히하기 위해유효하지 않은또는비어 있지 않음 ~확장 필드에 대한 몇 가지 예는 다음과 같습니다.

printf %s\\n ~some_user_name ~some_user_name/some_more_stuff

위의 확장 컨텍스트는 모두 다음과 같습니다.아니요null - 물결표는 경로 이름으로만 확장될 수 있습니다.일부 사용자 이름의 홈 디렉토리이며, 등록된 사용자 이름이 현재 시스템에 존재하는 경우에만 해당됩니다. 두 번째는 ~확장되어야합니다(또는 확장하지 않음)경로 /구분 기호가 후행 컨텍스트를 분리하므로 첫 번째 것과 동일합니다. 쉘이 존재 여부를 확인할 수 없는 경우일부 사용자 이름그럼 ~보관해야지그냥 물결표.

printf %s\\n ~/some_user_name /~/ ~

하지만 여기에 첫 번째와 세 번째에 대한 확장 필드가 있습니다.물결표는유효하지 않은. 첫 번째는 경로 구분 기호로 구분됩니다. 두 번째도 유사하게 구분되어 있지만 쉘 단어를 도입하지 않기 때문에 확장은 고려조차 되지 않습니다. 첫 번째와 세 번째틸데둘 다 환경 변수의 현재 값으로 확장되어야 하며 $HOME확장 결과는 다음과 같아야 합니다.

printf %s\\n "$HOME"/some_user_name /~/ "$HOME"

"$HOME"/some_user_name확장을 위해 물결표를 한정하기 위해 위의 경로가 실제로 존재할 필요는 없습니다. 이전 예와 마찬가지로 이것이 ~some_user_name/some_more_stuff이식 가능한 경로 확장의 유일한 속성입니다. 전형적인파일 이름 생성또는쉘 와일드카드특수 쉘 문자를 사용하여 시도할 수 있는 동작 중 하나 ?[*는 해당 문자를 확장하는 것입니다.성냥구문 분석된 경로 이름이지만 그렇지 않은 경우에는 그대로 둡니다. 이것틸데그러나 그 대신미리 지정된 값 - -에 명시된 바와 같이 $HOME, 연장 자격이 절대적인 경우에는 매칭이 불가능합니다.

또한 위에 사용된 인용문은 의도적인 것입니다.~ 틸데확장은 따옴표 안에 표시되지 않으며 확장된 값은 항상 리터럴이며 추가 경로 이름 확장이나 어떤 종류의 쉘 분할에도 영향을 받지 않습니다. 확장할 때 대부분의 다른 확장에 따옴표가 필요한 것과 같은 방식으로 확장됩니다. 이것은(매우 유용할 수 있음)물론 $HOME이는 실제 환경 변수의 확장된 동작과 대조됩니다.

아까도 암시했듯이,~ 틸데확장이 실행 명령의 구분된 경로 구성 요소를 완료하지 않는 한 확장은 매개 변수 또는 할당 컨텍스트에서만 발생할 수 있습니다. 따라서 ~통과된 단일 명령 위치는 확장되지 않습니다. 따라서 다음 명령이 실행되도록 ~쉘을 할당할 수 있습니다.alias

~ ~

...입력 컨텍스트를 기반으로 완전히 처리되는 두 개의 독립적이고 고유한 확장 값을 생성합니다. 사용자는 호출 될 ~ alias때 쉘 변수의 값을 정의하여 두 번째 변수가$HOME틸데확장자가 처음 변경되었습니다.(재귀의 경우 그 반대일 수도 있음).

사실 난 생각하는 걸 좋아해~ 틸데로서매개변수 별칭. 나는 종종 $IFS확장자가 - 및 의 영향을 받지 않는 - 와 $*함께 사용합니다 eval. $IFS내 필요에 따라 단일 문자로서 단일 확장을 통해 문자열에서 완전히 제거되거나 발생할 때마다 다른 문자로 안전하게 대체될 수 있기 때문에 상황에 잘 맞는다고 생각합니다 . 매개변수 배열은 다음과 같습니다.

"$argv1" ~ "$argv2" ~ "$argv3" ~

...가능한(안전하게)주어진 시간에 많은 것의 가치를 $HOME내가 원하는 것에 일시적으로 재할당하고 eval가치를 부여합니다. 이러한 매개변수 배열은 교묘하게 대체 항목을 적용하여 원래 매개변수 구분 지점의 다른 배열에서 생성될 수도 있습니다 $*.

내가 사용하고 싶은 또 다른 구조는 다음과 같습니다.

for HOME in ./* ~; do stuff w/ $HOME and ~; done

...나를 이렇게 만든다각 반복에 할당된 값입니다. 그 중 하나를 사용하면 전역 문자를 분할하거나 추가하는 형태로 즉시 자유롭게 구문 분석을 적용할 수 있고, $IFS다른 하나를 사용하면 항상 반복의 원래 매개변수 값을 문자 그대로 참조할 수 있습니다. 게다가 쉘 따옴표로 너무 복잡하게 만들지 않고도 동일한 명령의 인수 목록에서 이러한 작업을 나란히 수행할 수 있습니다.

$HOME와 의 차이를 가장 명확하게 보여주는 것은 바로 이 마지막 지점이라고 생각합니다 ~.

답변3

쉘에서 사용자의 홈 디렉토리는 /home/username,

~홈 디렉토리에 대한 바로 가기입니다현재의쉘 사용자,

~usr은 사용자 이름에 대한 사용자 홈 디렉토리에 대한 바로가기 usr이므로 ~usr와 동일 합니다 /home/usr. 사용자 이름이 이면 usr~은( 는) ~usr동일합니다.

현재 사용자의 홈 디렉터리도 변수에 저장됩니다 $HOME.

관련 정보