我们都知道如何通过管道连接到 shell 脚本和已安装的程序(例如 grep、awk)...但是 .bashrc 或 .zshrc 中的源函数又如何呢?
这是一个测试函数:
function fff(){
echo "$@"
}
这是一个测试命令:
$ echo "hello world" | fff
它不起作用
答案1
您的函数需要命令行参数,而不是标准输入流上的数据(当您通过管道传递给它时它会获取)。
您可以做的是测试该函数是否给出了任何命令行参数,如果没有,则输出标准输入流:
fff () {
if [ "$#" -gt 0 ]; then
echo "$@"
else
cat
fi
}
测试:
$ echo "hi there" | fff
hi there
另一种解决方案是使用命令替换原始函数定义:
fff "$( echo "hi there" )"
这将$@
在函数中设置为单个字符串hi there
。如果管道数据是单个字符串或短行文本,这将是一个完全有效的解决方案。为了处理大量数据,请考虑以通常的逐行方式(可能使用awk
)代替cat
上述函数定义中的调用,并从管道中读取数据,如上面的测试所示。