bash 매뉴얼에서 물결표 확장에 대해:
만약에한 단어따옴표가 없는 물결표 문자('~')로 시작하여 따옴표가 없는 첫 번째 슬래시까지의 모든 문자(또는 따옴표가 없는 슬래시가 없는 경우 모든 문자)는 물결표 접두사로 처리됩니다.
~
왜 물결표 접두사로 인식되는지 알고 싶습니다.
$ mypath=/program_files:~/home/t
$ echo $mypath
/program_files:/home/t/home/t
mypath=/program_files:~/home/t
bash의 어휘 분석기는 어떤 단어를 무엇으로 분할합니까? ~/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>
, 아니면 둘다.
설명서에는 bash
이렇게 나와있어요
각 변수 할당은
:
a 또는 first 바로 뒤에 인용되지 않은 물결표 접두사가 있는지 확인합니다=
. 이러한 경우 물결표 확장도 수행됩니다. 따라서 에 대한 할당에 물결표 파일 이름을 사용할 수 있으며PATH
쉘MAILPATH
은CDPATH
확장된 값을 할당합니다.
즉, 인용되지 않은 문자열을 문자열 /program_files:~/home/t
에 할당 PATH
하면 그 안에 물결표가 확장되고 이는 $PATH
물결표가 확장된 문자열이 됩니다.
리터럴 물결표를 입력하면 PATH
(예: 문자열을 인용하여) 해당 디렉터리에 대한 명령 경로 이름 확인이 실패하게 됩니다(해당 리터럴 이름을 가진 디렉터리가 현재 작업 디렉터리에 존재하지 않는 한).
bash
PATH
POSIX 모드가 아닌 경우에도 명령을 찾을 때 물결표가 계속 확장됩니다.
쉘이 라인을 스캔할 때
mypath=/program_files:~/home/t
이는 단일 토큰으로 파서에 반환됩니다. 간단한 명령으로 처리됩니다.
간단한 명령은 할당으로 인식되면 물결표 확장 등을 거칩니다. 오른쪽으로 물결표 확장을 수행할 때 =
쉘은 문자열의 물결표가 콜론 뒤에 나타나기 때문에 현재 사용자의 홈 디렉토리로 확장합니다.
당신은 또한 볼 수 있습니다간단한 명령을 위한 POSIX 텍스트.