プログラムのマージ入力(stdin)を生成する方法

プログラムのマージ入力(stdin)を生成する方法

次のスクリプトを考えてみましょう。

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

コマンドは順次実行されますが、その出力は外部または次のコマンド入力から単一のストリームになります。したがって、上記の例の外部コマンドにはcatEOFなどが表示されませんが、内部コマンドを呼び出すのに高価な場合は、その費用を複数回支払います。この問題を解決する方法があるかどうか疑問です。

関連情報