为什么命令替换在括号中不起作用,但用实际数字替换却有效?

为什么命令替换在括号中不起作用,但用实际数字替换却有效?

我正在使用以下命令尝试最大化我的服务器上的核心数量:

for i in {1..`nproc --all`}; do while : ; do : ; done & done

由于某种原因,它只使用一个核心,尽管我的服务器有两个核心。如果我尝试用 替换`nproc --all`2它工作正常。为什么会这样?

答案1

括号扩展发生在命令替换之前。以下片段

{1..`nproc --all`}

根本不会扩展为括号。当命令替换扩展为 时2,它变为

{1..2}

但现在进行括号扩展已经太晚了。同样的问题将是如果你在那里使用了一个变量


此语法有效:

for ((i=1; i<=`nproc --all`; i++)); do echo "$i"; done

或者

for i in $(seq 1 "$(nproc --all)"); do echo "$i"; done

根据需要调整循环。请注意,在最后一种情况$(…)下,我使用了`…`因为这种形式很容易嵌套

相关内容