bash 函数的管道输出

Piping output of bash function

我正在尝试将两个 bash 函数的 inputs/outputs 与 管道。这是一个完整的程序来说明我的问题:

function print_info {
    files=$(ls);
    echo $files;
}
touch "file.pattern"
print_info | grep "pattern"
rm -f file.pattern

但这只是输出所有文件的列表,而不是匹配的文件 "pattern"。谁能帮我理解为什么?

不解析 ls 命令的输出。您可以使用 find 命令执行相同的操作,例如:

find . -maxdepth 1 -type f -exec grep "pattern" {} \;

如果你从一个函数中获取文件名,那么这样做:

grep "pattern" $(print_info)

这不起作用的原因是在

echo $files;

变量 $files 受到 shell 扩展(即扩展为 echo 的单独参数),结果标记由 echo 打印由空格分隔。这意味着它的输出是单行,grep 相应地处理它。

侵入性最小的修复方法是使用

echo "$files";