我想内联以下两个命令:
big_query_that_returns_text > in.txt
$ printf '%s\n' "foo" "bar" | grep -f /dev/stdin in.txt
foo
通过查找和bar
来工作in.txt
但当我尝试
printf '%s\n' "foo" "bar" | grep -f /dev/stdin big_query_that_returns_text
我收到
zsh: argument list too long: grep
我也尝试过
var=`big_query_that_returns_text`
printf '%s\n' "foo" "bar" | grep -f /dev/stdin $var
printf '%s\n' "foo" "bar" | grep -f /dev/stdin "$var"
但我收到同样的错误。
答案1
这是一个地方流程替代:它是一个像文件一样的代码块
将大查询结果通过管道传送到 grep 的 stdin
big_query_that_returns_text | grep -f <(printf '%s\n' "foo" "bar")
如果生成“foo”和“bar”的命令更复杂,您可以在进程替换中使用任意换行符来提高可读性:
big_query_that_returns_text \
| grep -f <(
printf '%s\n' "foo" "bar"
)
答案2
看来您想在 zsh 变量中搜索foo
或 ,bar
该变量基本上是某个命令的输出。我不确定为什么你要采取额外的方式将搜索字符串通过管道传输到grep
,但除非这是绝对必需的,否则你可以这样做
big_query_that_returns_text | grep -E "foo|bar"
big_query_that_returns_text
如果您想在多个地方使用 的输出,并因此将其存储在 shell 变量中,您仍然可以使用
var=$(big_query_that_returns_text)
printf '%s\n' "$var" | grep -E "foo|bar"
... (other operations on $var) ...
这里使用printf '%s\n'
.其他替代方案是print -r -- "$var"
或echo -E - "$var"
或使用此处文档或此处字符串。所有的printf
,print
和echo
都是内置的zsh
,所以你不会得到参数列表太长错误是系统调用的限制execve()
,因此仅适用于执行的外部命令(例如grep
不是内置的zsh
)。