variable = $...是否将命令或命令的结果存储在POSIX sh中

问题描述

我想知道:当我呼叫

list=$(ps -ax)

是ps -ax执行一次,我可以多次读取该值,还是每次调用$ list时都执行的命令

解决方法

解决方案是存储结果。 为了测试这一点,我使用了以下脚本

    #!/bin/sh
    myTime=$(date)
    for a in 1 2 3 4
    do
        echo 'Stored command: '$myTime
        echo 'Fresh command: '$(date)
        sleep 2
    done 

结果如下:

Stored commandTue Sep 29 17:39:44 +02 2020
Fresh commandTue Sep 29 17:39:44 +02 2020
Stored commandTue Sep 29 17:39:44 +02 2020
Fresh commandTue Sep 29 17:39:46 +02 2020
Stored commandTue Sep 29 17:39:44 +02 2020
Fresh commandTue Sep 29 17:39:48 +02 2020
Stored commandTue Sep 29 17:39:44 +02 2020
Fresh commandTue Sep 29 17:39:50 +02 2020

随时添加缺少的标签;不确定如何使像$()这样的东西最适合搜索引擎

,

POSIX sh保证不会重新执行该命令,请参见下文。

在通过经验测试得出关于POSIX sh的结论时要小心。例如,如果您对sleep 60 | true进行计时,则会发现bash,ksh,zsh和dash都需要60秒。但是,POSIX sh仍然允许它立即完成。


Spec for $()

外壳程序应通过在子外壳程序环境(请参见外壳程序执行环境)中执行命令并将命令替换项(命令文本加上“ $()”或反引号引起来)替换为标准输出,从而扩展命令替换项。命令。

when it's applied

当需要执行给定的简单命令时,以下扩展,分配和重定向都应从命令文本的开头到结尾全部执行:

[...]

  1. 在分配值之前,应先扩展波浪号扩展,参数扩展,命令替换,算术扩展和引号删除的每个变量赋值。

[...]

变量分配应按以下方式执行:

如果没有命令名称,则变量分配将影响当前的执行环境。

由于$()被替换为命令的文本,并且这种情况发生在分配变量之前,因此保证在符合POSIX sh的实现中不会重新执行该命令。

,

引用bash手册页:

Command Substitution
    Command substitution allows the output of a com-
    mand to replace the command name. There are two forms:
        $(command)
    or
        `command`

因此,存储命令的输出,而不是命令本身。 如果要存储每次评估的命令,则需要使用eval

#!/bin/bash

command="date"
startTime=$(date)
for i in `seq 1 4`
do
    echo "$i: $startTime - " $(eval $command)
    sleep 1
done