에서 언급된 주장을 만들 수 있는 방법이 있습니까?수동 명령개요 설명("기울임꼴 텍스트는 적절한 인수로 대체됩니다."라고 인용)에 메타 문자를 이스케이프하지 않고 포함하시겠습니까? 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 "(("
유용한 것을 제공하지 않습니다)
그러나 쉘의 구문에 너무 깊이 들어가는 것이 너무 유용한지는 잘 모르겠습니다. 복잡하고 약간 이상한 맛이 있습니다. 또한 위의 용어나 다른 내용에서 실수를 범했을 수도 있습니다.