누군가 아래 명령으로 무슨 일이 일어나고 있는지 설명할 수 있습니까 awk
? 오류가 없으면 notme
인쇄되지 않는 이유는 무엇이며 구문 오류가 발생하지 않는 이유는 무엇입니까? 닫는 괄호의 경우 ...}
따옴표로 닫아야 합니까 ...}'
?
$ awk '{print "me "$0 '"notme"} <<<"printme"
me printme
그런 다음 이것을 시도해 보겠습니다.
$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
me printme-at Wed Apr 11 16:41:34 DST 2018
또는
awk '{print '"\"$(date)\""} <<<"run"
Wed Apr 11 16:56:38 DST 2018
결과적으로 이는 쉘 명령 대체를 사용하여 모든 작업을 수행할 수 있음을 의미합니다.
이것은 버그입니까? 아니면 제가 찾을 수 없는 특별한 상태일 수도 있습니다.
답변1
처음으로
$ awk '{print "me "$0 '"notme"} <<<"printme"
여기서 일어나는 일은 다음과 같습니다.
- 작은따옴표로 묶인 부분은
awk
그대로 전달됩니다. - 다음 부분은
"notme"}
쉘에 의해 구문 분석된 후awk
결과 문자열로 전달됩니다.notme}
awk
당신은 이것을 볼 수 있습니다 :{print "me "$0 notme}
awk
변수 에는 값이 없으므로notme
다음과 같은 결과를 얻습니다.
두 번째로
$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at " me printme-at Wed Apr 11 16:41:34 DST 2018
awk
나는 값을 전달하기 위해 변수를 사용하여 다음과 같이 작성하는 것을 선호합니다 $(date)
.
awk -v date="$(date)" '{print "me "$0 date}' <<<"printme-at "
me printme-at Wed Apr 11 13:43:31 BST 2018
귀하의 버전에 구문 오류가 없는 이유를 문의하셨습니다. 그것을 분석해 봅시다:
# typed at the shell
awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
# prepared for awk
awk '{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}' <<<"printme-at "
# seen by awk
{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}
큰따옴표로 묶인 문자열은 근처에 도달 "\"$(date)\""
하기 전에 쉘에 의해 구문 분석되고 리터럴 문자열 (큰따옴표 포함) awk
처럼 (쉘에 의해) 평가됩니다 . "Wed Apr 11 13:43:31 BST 2018"
당신이 쓴 내용이 유효하기 때문에 문법 오류가 필요한 이유를 모르겠습니다. 비록 읽기에는 약간 복잡하지만.
답변2
awk
작은따옴표는 셸에서 프로그램을 구분하는 문자열을 종료합니다. awk
그 자체로는 결코 볼 수 없습니다. 그런 다음 프로그램의 초기 부분을 명령 대체를 통해 제공되는 추가 문자열 및 셸의 정적 문자열과 연결할 수 있습니다. 이 모든 일은 awk
통화 전에 발생합니다.
물론 명령 대체를 사용하여 나중에 코드로 읽혀지는 문자열을 수정할 수 있지만 awk
실제로는 코드를 쉽게 읽을 수 없으며 셸의 인용 규칙, 토큰화 등에 상당히 취약할 수 있습니다.
awk
일반적인 방법으로 변수를 설정 하는 것이 좋습니다 .
awk -v thedate="$(date)" '{ print $0, thedate }' <<<"something"