【发布时间】:2015-09-02 22:02:18
【问题描述】:
我想用管道调用一个函数,并将所有标准输入读入一个变量。
我读到正确的方法是使用read,或者read -r 或read -a。但是,我在实践中遇到了很多问题(尤其是多行字符串)。
最后还是选择了
function example () {
local input=$(cat)
...
}
这样做的惯用方法是什么?
【问题讨论】:
-
您需要将所有输入都放在一个字符串中还是需要对管道数据进行分段操作?
-
您是否尝试过类似
read -r -d\0 input的方法(假设您的输入不包含任何空字符)?这将为每个函数调用节省一个进程。不过我相信$(cat)解决方案更具可读性。 -
我认为这样做的惯用方法是不这样做。相反,在您打算使用该变量的地方读取 stdin 而不是使用该变量。如果您需要多次引用数据,请找出一种重构工作的方法,这样就没有必要了。你打算如何使用这个变量?
-
@williamPursell 我想先保存这一切,因为我想在处理它之前做其他事情(例如调用其他函数,声明其他变量等)。
-
除非您计划做的其他事情会消耗标准输入,否则您可以先执行它们而无需担心
stdin,直到您需要它。并且将其存储在一个变量中将需要存储内存并在您的其他工作甚至可以开始之前将其全部使用。