为什么带有命令替换字符串的 Bash 'while' 读取循环不读取整个输入?

为什么带有命令替换字符串的 Bash 'while' 读取循环不读取整个输入?

看一下这个非常基本的 Bash 脚本:

#!/bin/bash
while read l
do
  echo $l
  echo "next one"
done <<< $(ps aux)

我的计算机上有多个进程,并且该ps aux命令在终端中运行良好。

我只得到循环中的迭代和ps命令输出在同一行给出。为什么它没有按预期工作?

答案1

bash版本 <中,4.4-beta您需要添加双引号:

#!/bin/bash
while read l
do
  echo $l
  echo "next one"
done <<< "$(ps aux)"

看:


一般来说,我认为使用进程替换更好:

#!/bin/bash
while read l
do
  echo $l
  echo "next one"
done < <(ps aux)

(为了避免出现问题,你可能想使用IFS=)。

或者更好的是,使用专门用于读取文件或逐行输入的程序,例如awk.

ps aux | awk '{print $0; print "next one"}'

相关内容