内存压力命令出现问题 - 字符串意外结束

内存压力命令出现问题 - 字符串意外结束

我在 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.        (换行符,十六进制 0x0A)
  5. "

结果 shell 看到两行:

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。

相关内容