在bash函数中,如何将stdin放入变量中

时间:2015-09-02 22:02:18

标签: linux bash shell

我想用管道调用函数,并将所有stdin读入变量。

我读到这样做的正确方法是使用read,或者read -rread -a。但是,我在实践中遇到了很多问题(尤其是多行字符串)。

最后我决定

function example () {
  local input=$(cat)
  ...
}

这样做的惯用方法是什么?

3 个答案:

答案 0 :(得分:5)

如果你真的需要,

input=$(cat)是捕获标准输入的完美方式。需要注意的是,命令替换会删除所有尾随换行符,因此如果您还想确保捕获这些换行符,则需要确保最后读取除换行符之外的其他内容。

input=$(cat; echo x)
input=${input%x}   # Strip the trailing x

bash 4或更高版本中的另一个选项是使用readarray命令,该命令将使用每行标准输入填充数组,每个元素一行,然后您可以将其连接回一个如果需要,可以使用单个变量。

readarray foo
printf -v foo "%s" "${foo[@]}"

答案 1 :(得分:0)

SO上有一些重叠/非常相似的问题。我在这里使用内置的read进行了回答:

https://stackoverflow.com/a/58452863/3220983

但是,在我的回答中,我只关注行。

cat方法的可争议之处在于,它需要产生一个子shell。否则,这是一个很好的选择。如此处特别查询的那样,这可能是处理多行处理的最简单方法。

认为 read方法可以更快/更节省资源,如果您试图链接很多命令,或者遍历列表重复调用函数。

答案 2 :(得分:0)

我发现与基于我运行的测试的其他方法相比,使用cat确实很慢:

local input="$(< /dev/stdin)"