次の2つのコマンドをインラインにしたいと思います。
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
デフォルトでは、いくつかのコマンドの出力であるfoo
zsh変数を検索したいようです。bar
なぜ検索文字列をパイピングする追加の方法を使用するのかわかりませんgrep
。
big_query_that_returns_text | grep -E "foo|bar"
big_query_that_returns_text
複数の場所で出力を使用してシェル変数に保存したい場合は、次のこともできます。
var=$(big_query_that_returns_text)
printf '%s\n' "$var" | grep -E "foo|bar"
... (other operations on $var) ...
ここを使用してくださいprintf '%s\n'
。もう1つの選択肢は、ここのドキュメントまたはここの文字列を使用することprint -r -- "$var"
です。echo -E - "$var"
すべてprintf
、print
およびecho
が組み込まれているのでzsh
取得できません。パラメータリストが長すぎます。エラーはシステムコールの制限なので、実行された外部コマンド(組み込みコマンドなど)execve()
にのみ適用されます。grep
zsh