흔들리는 대시(물결표, ~)는 어떤 종류의 언어 구조인가요?

흔들리는 대시(물결표, ~)는 어떤 종류의 언어 구조인가요?

홈 디렉토리 대신 스윙 대시를 사용할 수 있습니다. 현재 사용자에 따라 값이 다릅니다. 이런 의미에서는 변수와 같습니다.

하지만 변수는 아닙니다. 나는 그것을 할 수 없지만, echo $~나는 그것을 할 수 있다 echo ~.

어떤 종류의 언어 구조입니까?

답변1

물결표( ~)가 따옴표 없이 단독으로 또는 사용자 이름의 접두사로 나타나는 경우물결표 확장. 이것은 쉘에 의해 수행된 단어 확장 중 하나입니다.성격이는 프로그램을 구성하고 매개변수 확장 전에 발생하는 구문 표시입니다. ㅏ단어셸 입력(예: 명령줄의 스크립트 또는 명령)의 토큰이지만 아직 인식되지 않았습니다.예약어if, 또는 , do또는운영자좋아요 ||&&.

이는 어떤 경우에는 물결표가 변수가 아니라 물결표 확장 단계에서 쉘이 구체적으로 속한 단어를 처리하도록 하는 문자라는 것을 의미합니다. 이는 현재 단어를 다른 확장 유형의 후보로 $표시하는 것과 유사합니다 .$

이것은 정의되어 있습니다POSIX를 통해(이것은 실제로 확장이 발생했을 때 방금 설명했던 것보다 조금 더 조심스럽습니다.)

2.6.1 물결표 확장

"물결표 접두사"는 <tilde>단어 시작 부분의 따옴표가 없는 문자로 구성되며, 그 뒤에는 <slash>단어에서 따옴표가 없는 첫 번째 문자 앞의 모든 문자가 오고, 없는 경우 단어의 모든 문자가 옵니다 <slash>. 할당(XBD 변수 할당 참조)에서는 단어 시작 부분(즉, <equals-sign>할당 뒤), 따옴표가 없는 문자 뒤 <colon>또는 둘 다에 여러 개의 물결표 접두사를 사용할 수 있습니다. 과제의 물결표 접두사는 따옴표가 없는 첫 번째 <colon>또는 로 끝납니다 <slash>. 물결표 접두사에 인용되지 않은 문자가 있는 경우 물결표 접두사 뒤의 문자는 <tilde>사용자 데이터베이스에서 가능한 로그인으로 처리됩니다. 휴대용 로그인 이름은 LOGNAMEXBD 기타 환경 변수의 환경 변수 설명에 지정된 문자 집합 이외의 문자를 포함할 수 없습니다. 로그인 이름이 비어 있는 경우(즉, 물결표 접두사에 물결표만 포함된 경우) 물결표 접두사는 변수 값으로 대체됩니다 HOME. 설정하지 않으면 HOME결과가 지정되지 않습니다. 그렇지 않으면 물결표 접두어를 getpwnam()POSIX.1-2017 시스템 인터페이스 볼륨에 정의된 함수를 사용하여 얻은 로그인과 관련된 초기 작업 디렉터리의 경로 이름으로 바꿔야 합니다. 시스템에서 로그인 이름을 인식하지 못하면 결과가 정의되지 않습니다.

물결표 확장으로 생성된 경로 이름은 필드 분할 및 경로 이름 확장으로 인해 변경되는 것을 방지하기 위해 따옴표로 처리해야 합니다.

답변2

나는 @Kusalananda와 @stéphane-chazelas의 의견을 바탕으로 이 질문에 직접 대답하려고 합니다.

쉘은 명령줄 해석기입니다. 입력 토큰을 엄격하게 입력하지 않습니다. 치료는 특정 상황에 따라 다릅니다. 두 가지 합리적인 대답이 있습니다.

답변 1

쉘에 대한 입력을 해석할 때 타이핑이 없기 때문에 물결표는 전혀 "일부 언어 구성"이 아닙니다. 컨텍스트에 따라 입력을 동적으로 처리합니다.

답변 2

물결표 유형은 가상 유형의 "경로"에 가장 가깝습니다. 일반적인 상황에서는 변수와 유사한 속성을 갖는 홈 디렉터리로 확장되지만 그렇지 않습니다.

답변 1의 근거

Bash에는 흐름 제어 토큰도 입력되지 않습니다.

echo while

이것은 실수가 아닙니다. 이 경우에는 "while"만 인쇄합니다.

물결표는 상황에 따라 다르게 처리됩니다. 일반적으로 사용자의 홈 디렉터리로 확장됩니다.

echo ~

다른 경우에는 확장되지 않습니다.

echo "~"
echo ~~

답변 2의 근거

POSIX 정의는 인용되지 않은 물결표를 "단어"로 취급합니다. 일반적으로 쉘에 의해 홈 디렉토리로 확장됩니다.앞으로쉘 자체에서 경로로 사용되거나 다른 프로그램에 인수로 제공되기 전에 사용됩니다.

실행 파일의 경로로 사용:

~/bin/myprogram

인수의 경로로 사용됩니다.

ls ~

인수로 전달하기 전에 홈 디렉터리로 확장하더라도 경로일 필요는 없습니다.

echo ~

마찬가지로 일반적인 사용 사례에서는 셸에서 인용되지 않은 단어가 경로로 사용되고 인용된 단어는 문자열 인수로 사용됩니다. 실행 파일에 대한 각 호출은 $PATH를 기준으로 합니다. 파일 시스템의 경로를 기반으로 단어를 확장하려면 클릭하세요.

**요약**

비정형적인 방법으로 셸을 사용할 수 있습니다. 예를 들어, 실행 파일의 경로로 인용된 문자열을 사용할 수 있습니다.

"echo" echo 

이 인쇄물은 에코입니다. 인용된 문자와 인용되지 않은 문자의 일반적인 사용법은 반대입니다.

답변 2의 이론적 근거는 실제 유형이 아닌 관례를 기반으로 합니다. 쉘의 아키텍처는 동적 아키텍처입니다.

관련 정보