次のスクリプトを考えてみましょう。
echo a
echo b
echo c
3つの行が作成されます。これで、次のように実行できます。
abc_script | real_program
real_program
入力にこの3つのファイルをインポートします。しかし、ユーザーには問題があります。abc_script
出力をreal_program
。
では、このリダイレクトをスクリプトに移動するにはどうすればよいですか?次のようなもの(スクリプト):
echo a | echo b | echo c | real_program
これはうまくいきません。これは私がやりたいことを例示しただけです。real_program
スクリプト内で呼び出しを隠すことです。
記録の場合:私の場合、入力はいくつかのファイルと追加の行で構成されています。だから私は持っています:
cat $input_file
echo $extra_line
ただa、b、cではありません。
答え1
このように:
( echo a
echo b
echo c ) | real_program
サブシェルで3つのコマンドを実行し、echo
サブシェルの出力をスクリプトにパイプします。
サブシェルはフレーズシュガーですbash -c 'echo a; echo b; echo c' | real_program
。
答え2
別の方法は
echo -e "$(cat $input_file)\n$extra_line" | real_program
答え3
<()
3番目の方法は、コマンドの入力をリダイレクトすることです。これは少なくともGNU bash 4.2.37で動作し、最新のbashや他のシェルでも機能する必要があります(一般的なサポートが何であるかわかりません)。
$ echo hello > test
$ echo my > test
$ echo beautiful > test
$ cat <(cat test; echo world)
hello
my
beautiful
world
$
アイデアは、まずファイルを生成してから、cat
コマンドシーケンスの出力から開始して標準入力をリダイレクトすることですcat test; echo world
。出力が示すように、この入力はすべての入力リダイレクトコマンドの出力を連結したものです。
同じことを表現する別の方法(おそらくより移植性が高い)は、コマンドに通常のサブシェルパイプで簡単に書き直すことです。
(cat test; echo world) | cat
コマンドは順次実行されますが、その出力は外部または次のコマンド入力から単一のストリームになります。したがって、上記の例の外部コマンドにはcat
EOFなどが表示されませんが、内部コマンドを呼び出すのに高価な場合は、その費用を複数回支払います。この問題を解決する方法があるかどうか疑問です。