매개변수에 메타문자가 포함될 수 있나요?

매개변수에 메타문자가 포함될 수 있나요?

에서 언급된 주장을 만들 수 있는 방법이 있습니까?수동 명령개요 설명("기울임꼴 텍스트는 적절한 인수로 대체됩니다."라고 인용)에 메타 문자를 이스케이프하지 않고 포함하시겠습니까? Tom Ryder가 언급한 논증의 정의에 따르면 다음과 같습니다.Bash 빠른 시작 가이드(ISBN 978-1-78953-408-5, 21페이지), 메타 문자는 인수를 구분하지만(적어도 공백의 경우) bash 스크립트에서는 예를 들어 I와 같이 왼쪽 및 오른쪽 대괄호가 사용되는 것을 볼 수 있습니다. 말했듯이 그들은 인수의 일부입니다. . 예를 들어 다음 스크립트는 다음과 같습니다 NUMBER='^[0-9]+$'.

답변1

내 생각에 "메타문자"는 다소 모호한 용어입니다.

Bash의 매뉴얼 페이지는 엄격한 의미를 제공합니다.

메타 문자: 인용되지 않은 단어를 구분하는 데 사용되는 문자입니다. 다음 중 하나: | & ; ( ) < >공백 탭 줄 바꿈"

따라서 쉘에서 실행된 명령에 전달된 인수를 의미한다면 정의에만 근거하여 대답은 오히려 "아니요"일 것입니다.

반면에 다른 특수 문자에도 사용되는 경우가 있습니다. 전역 문자(예: []*?) 또는 이와 유사한 {}!#$특정 항목을 포함하는 경우 대답은 아마도 "때때로"일 것입니다.


특히 POSIX와 유사한 셸에서 기본적으로 glob 패턴과 일치하는 파일이 없으면 ls blahblah?*[123].txt호출은 인수로 이루어집니다 ls. blahblah?*[123].txt(있는 경우 해당 이름이 확장됩니다. 그리고 zsh 및 csh는 달리 요청하지 않는 한 불평만 합니다.) 그리고 while을 {지원하는 쉘에서 중괄호 확장을 시작합니다. 단어의 나머지 부분도 중괄호 구문을 준수하는 경우에만 특수 확장만 가능합니다. . ls {단일 매개변수만 전달되지만 {두 개의 매개변수 가 ls foo{a,b}전달됩니다 fooa. foob그리고 $그 이후에 어떤 일이 일어나는지에 따라 일부 확장이 실행될 수도 있고 실행되지 않을 수도 있습니다. echo foo$인쇄 foo$하지만 echo foo<오류가 발생합니다.

여기서 중요한 점은 이것이 |&;()<>쉘의 어휘 분석기에 특별하므로 명령줄 처리 초기에 인식되고 *?[]$명령줄이 처음에 단어로 분할된 후에만 인식된다는 것입니다. !그리고 #일부는 (기록 확장 및 설명이 활성화된 경우) 더 일찍 인식되기 때문에 더 특별합니다. 그러나 이는 어휘분석기 단계에 아무런 영향을 미치지 않기 때문에 같은 의미의 메타 문자가 아닙니다. echo foo! foo#인쇄 foo! foo#.

저것 [[? blah blah blah 와 같이 이상하게 보이는 키워드일 뿐입니다 if. while아니면 {. (try type if, , type {. type [[) 내부 파싱에 영향을 미치는 키워드이지만 메타문자로 구성되지 않고 echo [[계속 출력됩니다 [[. 와 비교해 보세요 . ((어디에 echo ((오류가 있나요? ( type ((작동하지 않으며 type "(("유용한 것을 제공하지 않습니다)

그러나 쉘의 구문에 너무 깊이 들어가는 것이 너무 유용한지는 잘 모르겠습니다. 복잡하고 약간 이상한 맛이 있습니다. 또한 위의 용어나 다른 내용에서 실수를 범했을 수도 있습니다.

관련 정보