메모리 압력 명령 문제 - 예기치 않은 문자열 끝

메모리 압력 명령 문제 - 예기치 않은 문자열 끝

Python에서 이 명령을 사용하는 데 문제가 있습니다.

stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.95;}' < /proc/meminfo)k --vm-keep -m 1

명령의 시작과 끝 부분에 큰따옴표를 넣어야 합니다. 예를 들면 다음과 같습니다.

"stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1"

내부 따옴표를 이스케이프 처리한 후 예기치 않은 문자열 끝이 발생했습니다.

"stress-ng --vm-bytes $(awk '/MemAvailable/{printf \"%d\n\", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1"

이 문제를 해결하는 방법을 아는 사람이 있나요?

답변1

문자열의 문자 52-59,

"stress-ng --vm-bytes $(awk '/MemAvailable/{printf \"%d\n\", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1"
                                                   ↑↑↑↑↑↑↑↑

위에 강조표시되어 있으며 아래에 개별적으로 표시되어 있습니다.

                                            \  "  %  d  \  n  \  "

다음과 같이 구문 분석됩니다.

  1. "     (따옴표 문자(이스케이프))
  2. %
  3. d
  4.        (개행 문자, 16진수 0x0A)
  5. "

결과적으로 쉘에는 두 줄이 표시됩니다.

stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d
", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

따라서 awk다음 두 줄의 프로그램이 표시됩니다.

/MemAvailable/{printf "%d
", $2 * 0.9;}

awk는 프로그램을 한 번에 한 줄씩 구문 분석하므로(백슬래시+줄 바꿈을 사용하지 않는 한) 불균형한 따옴표를 확인합니다. 아시다시피 합격하고 싶으시죠?

/MemAvailable/{printf "%d\n", $2 * 0.9;}

즉 , 실제 개행 문자 대신 문자를 보도록 awk하겠습니다 . 따라서 다음을 탈출해야 합니다 .awk\n\\n

"stress-ng --vm-bytes $(awk '/MemAvailable/{printf \"%d\\n\", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1"

그런데 첫 번째 명령은 0.95를 사용하지만 다음 두 줄에서는 0.9로 변경합니다.

관련 정보