Bash - 为什么循环中的这两个命令是连续运行而不是并行运行?

Geo*_*tes 3 bash loops

我正试图拿起一些bash,我无法弄清楚以下行为.我有一个循环,它看起来像一个命令通过整个循环运行的其他命令启动,即使他们是在同一个之前dodone结构.看我的例子:

这是shell脚本:

for i in "$(ls .)"
do
    printf "$i\n"
    printf "$i\n"
done
Run Code Online (Sandbox Code Playgroud)

如果这是与文件的目录运行a,b,c我希望可以将输出为:

a
a
b
b
c
c
Run Code Online (Sandbox Code Playgroud)

相反,它是:

a
b
c
a
b
c
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释发生了什么事吗?

arc*_*444 5

因为您在将表达式$(ls .)传递给循环之前将其展开,所以它首先评估目录中的所有文件然后再打印两次.实质上,您的循环只包含一个您打印两次的元素.

您可以通过使用glob *运算符来获取所需的行为:

for i in *
do
    printf "$i\n"
    printf "$i\n"
done
Run Code Online (Sandbox Code Playgroud)

这种方式*表示迭代的列表,而不是已经评估过的字符串.

  • @GeorgeYates:因为`ls`每行打印一个文件名*除非*`stdout`被重定向到终端.在交互式shell中,它是,并且您获得精简列化列表.请参阅`l`和`-C`选项到`ls`(以及`-m`和`-x`以获取更多选项.) (2认同)