如何在监视命令中保留嵌套命令替换
How to preserve nested command substitutions inside a watch command
我正在使用一个包含多个命令 st运行g 的 watch 命令,它们都可以工作,除了其中的一个。即使 运行 本身也没有所需的输出。
这里是监视命令 运行。
watch -n 5 echo "$(echo "$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100" | bc -l | cut -c-5)% overall CPU utilization"
输出显示执行时的 cpu 利用率,但不会更新。
Every 5.0s: echo 4.750% overall CPU utilization
我几乎可以肯定这是一个引用问题,但我一直在阅读并尝试不同的东西,但就是无法让它工作。
以下是我尝试过的一些不同版本的命令:
在内部命令 sub
上使用单引号
watch -n 5 echo "$(echo '$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100' | bc -l | cut -c-5)% overall CPU utilization"
Every 5.0s: echo % overall CPU utilization % overall CPU utilization
转义内部命令子上的单引号
watch -n 5 echo "$(echo \'$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100\' | bc -l | cut -c-5)% overall CPU utilization"
Every 5.0s: echo % overall CPU utilization % overall CPU utilization
在两组命令 sub 上使用单引号,并转义内部集合
watch -n 5 echo '$(echo \'$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100\' | bc -l | cut -c-5)% overall CPU utilization'
-bash: syntax error near unexpected token
)'`
在两组命令 sub 上使用单引号(到目前为止最接近所需的输出)
watch -n 5 echo '$(echo '$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100' | bc -l | cut -c-5)% overall CPU utilization'
Every 5.0s: echo $(echo 0.24/8*100 | bc -l | cut -c-5)% overall CPU utilization 3.000% overall CPU utilization
如果我能确定如何让它每次都重新运行 $(uptime | awk '{print}' | sed 's/,//g')
那么它应该可以工作。
我不确定 watch
部分应该做什么,但是您可以通过将所有处理重构到单个 Awk 脚本中来极大地简化它。
是这样的吗?
watch -n 5 'uptime | awk -v n="$(nproc)" "{cpu=$11; gsub(/,/, \"\", cpu); printf \"%0.3f%% overall CPU utilization\n\", cpu/n*100 }"'
引用有点烦人;您可能希望将单引号代码保存为脚本,这样您就可以在 Awk 代码周围切换为单引号并去掉反斜杠。
要跳过必须引用命令,您可以使用
myfunc() {
insertYourCodeHere
}
export -f myfunc
watch -n5 bash -c myfunc
我正在使用一个包含多个命令 st运行g 的 watch 命令,它们都可以工作,除了其中的一个。即使 运行 本身也没有所需的输出。
这里是监视命令 运行。
watch -n 5 echo "$(echo "$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100" | bc -l | cut -c-5)% overall CPU utilization"
输出显示执行时的 cpu 利用率,但不会更新。
Every 5.0s: echo 4.750% overall CPU utilization
我几乎可以肯定这是一个引用问题,但我一直在阅读并尝试不同的东西,但就是无法让它工作。
以下是我尝试过的一些不同版本的命令:
在内部命令 sub
上使用单引号watch -n 5 echo "$(echo '$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100' | bc -l | cut -c-5)% overall CPU utilization"
Every 5.0s: echo % overall CPU utilization % overall CPU utilization
转义内部命令子上的单引号
watch -n 5 echo "$(echo \'$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100\' | bc -l | cut -c-5)% overall CPU utilization"
Every 5.0s: echo % overall CPU utilization % overall CPU utilization
在两组命令 sub 上使用单引号,并转义内部集合
watch -n 5 echo '$(echo \'$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100\' | bc -l | cut -c-5)% overall CPU utilization'
-bash: syntax error near unexpected token
)'`
在两组命令 sub 上使用单引号(到目前为止最接近所需的输出)
watch -n 5 echo '$(echo '$(uptime | awk '{print}' | sed 's/,//g')/$(nproc)*100' | bc -l | cut -c-5)% overall CPU utilization'
Every 5.0s: echo $(echo 0.24/8*100 | bc -l | cut -c-5)% overall CPU utilization 3.000% overall CPU utilization
如果我能确定如何让它每次都重新运行 $(uptime | awk '{print}' | sed 's/,//g')
那么它应该可以工作。
我不确定 watch
部分应该做什么,但是您可以通过将所有处理重构到单个 Awk 脚本中来极大地简化它。
是这样的吗?
watch -n 5 'uptime | awk -v n="$(nproc)" "{cpu=$11; gsub(/,/, \"\", cpu); printf \"%0.3f%% overall CPU utilization\n\", cpu/n*100 }"'
引用有点烦人;您可能希望将单引号代码保存为脚本,这样您就可以在 Awk 代码周围切换为单引号并去掉反斜杠。
要跳过必须引用命令,您可以使用
myfunc() {
insertYourCodeHere
}
export -f myfunc
watch -n5 bash -c myfunc