我想用管道调用函数,并将所有stdin读入变量。
我读到这样做的正确方法是使用read
,或者read -r
或read -a
。但是,我在实践中遇到了很多问题(尤其是多行字符串)。
最后我决定
function example () {
local input=$(cat)
...
}
答案 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)"