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 \ "
次のように解析されます。
"
(引用符文字(エスケープ))%
d
- (改行文字、16進数0x0A)
"
その結果、シェルには2行が表示されます。
stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d
", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1
したがって、awk
次の2行のプログラムが表示されます。
/MemAvailable/{printf "%d
", $2 * 0.9;}
awkはプログラムを一度に1行ずつ解析します(バックスラッシュ+改行を使用しない限り)、アンバランスな引用符を確認します。ご存知のように合格したいですか?
/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を使用しますが、次の2行では0.9に変更します。