watch -n1 $() 不会在每个时间间隔运行 $()

watch -n1 $() 不会在每个时间间隔运行 $()

watch -n1 $()不更新$()。

解决方法是什么?

这是我的例子:

watch -n1 echo $(( $(date +%s -d "sun") - $( date +%s ) ))

这导致

Every 1.0s: echo 106602                                                                                                                                                                                     

106602

预期输出应该是:

Every 1.0s: echo $(( $(date +%s -d "sun") - $( date +%s ) ))

106602

106602每秒都在减少

答案1

很可能每个间隔运行 - 但每次都会覆盖相同的值,因为算术表达式在传递给命令之前由交互式 shell 计算watch。如果您pgrep从另一个终端运行,您可以看到这一点:

watch -n1 echo $(( $(date +%s -d "sun") - $( date +%s ) ))

然后

$ pgrep -af watch
81 watchdogd
29311 watch -n1 echo 111748

您可以通过单引号表达式来防止早期评估:

watch -n1 echo '$(( $(date +%s -d "sun") - $( date +%s ) ))'

给予

$ pgrep -af watch
81 watchdogd
29543 watch -n1 echo $(( $(date +%s -d "sun") - $( date +%s ) ))

/bin/sh默认情况下,它将把表达式传递给shell。

相关内容