bash의 어휘 분석기는 명령을 단어로 나누기 위해 어떤 구분 기호를 사용합니까?

bash의 어휘 분석기는 명령을 단어로 나누기 위해 어떤 구분 기호를 사용합니까?

bash 매뉴얼에서 물결표 확장에 대해:

만약에한 단어따옴표가 없는 물결표 문자('~')로 시작하여 따옴표가 없는 첫 번째 슬래시까지의 모든 문자(또는 따옴표가 없는 슬래시가 없는 경우 모든 문자)는 물결표 접두사로 처리됩니다.

~왜 물결표 접두사로 인식되는지 알고 싶습니다.

$ mypath=/program_files:~/home/t
$ echo $mypath
/program_files:/home/t/home/t

mypath=/program_files:~/home/tbash의 어휘 분석기는 어떤 단어를 무엇으로 분할합니까? ~/home/t단어로 정확하게 인식 되나요 ?

bash의 어휘 분석기는 명령을 단어로 나누기 위해 어떤 단어 구분 기호를 사용합니까? 단어 구분 기호 :입니까 = ? 그것도 말인가요?

감사해요.

이건 내 이해력 부족에서 비롯된 거야https://unix.stackexchange.com/a/448469/674

PATH 문자열 내의 물결표 문자를 이해할 수 없습니다. 이것이 POSIX 표준에서 쉘 매크로를 할당할 때 명령줄에서 콜론 뒤에 물결표 시퀀스를 확장하도록 요구하는 이유입니다.

답변1

이는 단어분할(더 정확하게는 토큰분할)의 결과는 아니지만,물결표 확장변수 할당에서:

각 변수 할당은 ":" 또는 첫 번째 "=" 바로 뒤에 인용되지 않은 물결표 접두사가 있는지 확인합니다. 이러한 경우 물결표 확장도 수행됩니다.

Bash가 명령을 토큰으로 분할할 때 Bash에서 사용하는 단어 구분 기호는메타 문자:

인용되지 않은 경우 단어를 구분하는 데 사용되는 문자입니다. 메타 문자는 공백, 탭, 줄 바꿈 또는 "|", "&", ";", "(", ")", "<" 또는 ">" 문자 중 하나일 수 있습니다.

mypath=/program_files:~/home/t

Bash의 관점에서 보면 이는 단일 태그입니다.

답변2

PATH물결표 는 변수 할당이고 물결표는 인용되지 않은 콜론 바로 뒤에 오기 때문에 할당에서 확장됩니다 (귀하의 예에서).

"물결표 접두사"는 <tilde>단어 시작 부분의 따옴표가 없는 문자로 구성되며, 그 뒤에는 <slash>단어에서 따옴표가 없는 첫 번째 문자 앞의 모든 문자가 오고, 없는 경우 단어의 모든 문자가 옵니다 <slash>. 할당(XBD 변수 할당 참조)에서는 여러 물결표 접두사를 사용할 수 있습니다. 단어 시작 부분(즉, <equals-sign>할당 뒤) 에인용되지 않은 어떤 것에도<colon>, 아니면 둘다.

(에서물결표 확장에 대한 POSIX 텍스트)

설명서에는 bash이렇게 나와있어요

각 변수 할당은 :a 또는 first 바로 뒤에 인용되지 않은 물결표 접두사가 있는지 확인합니다 =. 이러한 경우 물결표 확장도 수행됩니다. 따라서 에 대한 할당에 물결표 파일 이름을 사용할 수 있으며 PATHMAILPATHCDPATH확장된 값을 할당합니다.

즉, 인용되지 않은 문자열을 문자열 /program_files:~/home/t에 할당 PATH하면 그 안에 물결표가 확장되고 이는 $PATH물결표가 확장된 문자열이 됩니다.

리터럴 물결표를 입력하면 PATH(예: 문자열을 인용하여) 해당 디렉터리에 대한 명령 경로 이름 확인이 실패하게 됩니다(해당 리터럴 이름을 가진 디렉터리가 현재 작업 디렉터리에 존재하지 않는 한).

bashPATHPOSIX 모드가 아닌 경우에도 명령을 찾을 때 물결표가 계속 확장됩니다.


쉘이 라인을 스캔할 때

mypath=/program_files:~/home/t

이는 단일 토큰으로 파서에 반환됩니다. 간단한 명령으로 처리됩니다.

간단한 명령은 할당으로 인식되면 물결표 확장 등을 거칩니다. 오른쪽으로 물결표 확장을 수행할 때 =쉘은 문자열의 물결표가 콜론 뒤에 나타나기 때문에 현재 사용자의 홈 디렉토리로 확장합니다.

당신은 또한 볼 수 있습니다간단한 명령을 위한 POSIX 텍스트.

관련 정보