아래 스크린샷에서는 이해가 되지 않습니다.제삼지름길표 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
껍데기틸데그러나 확장은 쉘 확장이 거의 모든 것에 적용된다는 점에서 독특합니다.
처음에는 이해하기가 조금 어렵습니다. 아마도 이것이 이유일 것입니다.틸데보다 일반적인 유형에 부정적인 영향을 미치는 경향이 있는 여러 유형의 셸 확장 취약점에 면역이지만 그 사용은 충분히 활용되지 않습니다.
쉘은 휴대용을 고려할 수 있습니다틸데다음 조건 중 하나에 해당하는 경우 확장을 받을 수 있습니다.
=
쉘 변수 할당에서 첫 번째 또는 콜론 문자 바로 뒤.- 쉘 매개변수 번호를 시작하십시오.
- 셸 경로를 시작하고 올바르게 구분된 하나 이상의 완전한 경로 구성 요소를 단독으로 완료하거나 후행 컨텍스트를 사용하여 확인할 수 있습니다.
이러한 경우에도~
틸데~ 할 것이다아니요참조되거나 컨텍스트가 어떻게든 확장을 방해하는 경우 확장될 수 있습니다.완전히일부 사용자의 홈 디렉터리 또는 환경 변수의 현재 값입니다 $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
.