타사 스케줄러에서 실행하는 작업의 작업 출력을 전달하고 싶습니다. 스케줄러를 사용하면 다음과 같은 명령에 출력을 삽입할 수 있습니다.
python script.py --job-output '{joboutput}'
이는 {joboutput}
스케줄러가 전달한 원시 작업 출력이 됩니다.
제가 겪고 있는 문제는 작업 출력에 불균형한 작은따옴표와 큰따옴표(및 특수 문자 등)가 포함될 수 있으므로 (
작업 |
출력을 작은따옴표나 큰따옴표로 묶는 것이 작동하지 않는다는 것입니다.
비슷한 질문을 많이 살펴봤지만 이 정확한 시나리오를 다루는 질문을 찾지 못했습니다. 어떤 제안이라도 주시면 매우 감사하겠습니다. 매우 감사합니다!
답변1
해당 명령줄이 스케줄러에 의해 사전 처리된 다음 실행을 위해 셸로 전송된 경우(예: 그래도 sh -c
), 간단한 텍스트를 실제 텍스트로 바꾼 후에 {joboutput}
요청한 내용을 실제로 수행할 수 없습니다. 어쨌든, 한 줄에만 있는 것이 아닙니다.
그것예임의의(NUL 종료) 문자열은 명령줄 인수로 전달될 수 있지만(최대 길이까지) 셸 명령줄에 문자열을 삽입하려면 셸의 구문/인용 규칙을 따라야 합니다.
기본적으로 쉘에는 큰따옴표, 작은따옴표 및 백슬래시 이스케이프 기능이 있습니다. 큰따옴표 안에는 백슬래시 앞에 일부 문자를 추가하여 이스케이프해야 하므로 그 안에 임의의 문자열을 넣을 수 없습니다. 작은따옴표 내에서는 다른 것을 이스케이프할 필요가 없지만 작은따옴표 자체에는 특별한 처리가 필요합니다. 일반적인 접근 방식은 따옴표를 로 바꾸는 것입니다 '\''
. 이는 단순히 따옴표 붙은 문자열을 닫고 이스케이프된 작은따옴표를 삽입한 다음 따옴표 붙은 문자열을 다시 여는 것입니다. 그럼에도 불구하고 일부 캐릭터는 특별한 대우가 필요하며 이를 피할 수 있는 방법이 없습니다. 이는 따옴표로 묶인 문자열이 끝나는 위치를 결정하기 위해 쉘에 어떤 방법이 필요하기 때문입니다.
"{joboutput}"
따라서 and 를 또는 포함하는 항목 {joboutput}
으로 바꾸면 중단되고 , and 를 포함하는 항목으로 바꾸면 중단됩니다."
$
\
`
'{joboutput}'
{joboutput}
'
"""
일부 언어에는 Python의 / 와 같이 좀 더 장황한 따옴표가 있을 수 있습니다 '''
. 이는 때때로 개별 따옴표나 따옴표 쌍을 사용할 수 있으므로 도움이 될 수 있지만, 물론 출력에 동일한 """
또는 가 포함될 수 있으므로 여전히 완전히 보편적이지는 않습니다 '''
.
하지만 껍질에는 그런 것이 없습니다. 가장 가까운 것은 아마도 here-docs일 것이며 자유롭게 선택한 항목으로 구분됩니다.철사. 이는 삽입에 도움이 됩니다.거의임의의 문자열이지만 여러 줄을 전달할 수 있어야 하고 상당히 번거롭습니다.
여러 줄 명령을 사용할 수 있는 경우 명령 대체에서 here-doc와 관련된 셸의 구문 분석 오류를 금지 {joboutput}
하지 않는 것으로 대체하면 작동해야 합니다. END_OF_JOB_OUTPUT
여기에서 문서 구분 기호를 출력에 나타날 가능성이 낮은 다른 문자열로 변경할 수 있습니다. 그러나 여기서 데이터는 명령 대체를 거치기 때문에 데이터의 후행 줄 바꿈은 손실됩니다.
out=$(cat <<'END_OF_JOB_OUTPUT'
{joboutput}
END_OF_JOB_OUTPUT
)
python script.py --job-output "$out"
또는 명령 대체에 이 문서를 중첩하지 마십시오.
exec 9<<'END_OF_JOB_OUTPUT'
{joboutput}
END_OF_JOB_OUTPUT
out=$(cat <&9)
exec 9<&-
printf "%s\n" "$out"
스케줄러가 셸을 사용하지 않고 직접 명령을 실행할 수 있다면 셸 구문에 대해 걱정할 필요가 없습니다. 스케줄러는 작업 출력을 다른 인수로 명시적으로 전달하기 위한 몇 가지 현명한 방법만 있으면 script.py
됩니다 --job-output
. 그러나 우리는 그것이 그렇게 할 수 있는지 모릅니다. (또한 이 경우 자리 표시자 주위에 따옴표를 사용하지 않습니다.)
위의 셸 헛소리보다 더 쉬운 또 다른 방법은 환경 변수나 파일(스케줄러가 지원하는 경우)을 통해 문자열을 전달하는 것입니다.