web-dev-qa-db-ja.com

ファイルを予期しているプログラムにテキストを渡す

Stack Overflowで私が尋ねた質問に関連して: wsadmin.shに複数行のコードを渡す?

文字列として、コマンドにフィードする必要がある数行の入力があります。ただし、このコマンドは入力でいっぱいのファイルのみを受け入れます。

実際にディスクに書き込まれることのない一時ファイルまたはパイプに行を格納し、それをプログラムに直接供給する方法はありますか?

パイプを取得し、入力をパイプに送り、そのパイプをコマンドに渡し、パイプを取り除くにはどうすればよいですか?

32
ArtOfWarfare

別の解決策は、Bashで Process Substitution を使用することです。システムに名前付きパイプがある場合は、この機能を使用できます。

これは次のように使用されます:

_program_expecting_a_file <(list)
_

ここで、listはシェルコマンドのシーケンスです(実際にはパイプラインです。詳細は here です)。 listが実行され、その出力がパイプに接続されます。その後、パイプの名前がプログラムに渡されます。

注:_<_と_(_の間にはスペースを使用できません。

(他の置換>(list)も期待どおりに機能します。)

あなたの特定のケースでは、あなたは使うことができます

_program_expecting_a_file <(echo "$your_strings")
_

ただし、@ meuhのソリューションの方がエレガントな場合があります。

更新:非常に多くの使用例が Advanced Bash Scripting Guide にあります。

29
Edward

Bash here-docを使用できます。例えば、

$ cat -n <<<'a
> b'
 1  a
 2  b

Bash変数に何かがある場合は、それを補間することもできます。例:<<<"path is $PATH"


コマンドがファイル名を要求する場合は、/dev/stdin。例えば:

$ sed -f /dev/stdin <<<'s/a/b/'

出力を生成します:s/b/b/

15
meuh

スクリプトの内容に応じて、may特別なファイル名を使用できますマイナス)---(stdinを表します

$ mycmd -
Line 1
Line 2
^D

あなたのために働くかもしれない別の方法はファイルを開くことです/dev/fd/0これもstdinを表します。

3番目のオプションは[〜#〜] fifo [〜#〜](先入れ先出し)を作成することです。これはファイルのようなものですが、2つの目的があります。一方の端に書き込み、もう一方の端から読み取ります。

-- Process 1 --                  -- Process 2 --
$ mkfifo foo
$ cat foo
<waits>                          $ echo hello > foo
hello                            $
$ rm foo
7
Majenko

mycmd -ソリューションに似た別のオプションがありますが、-を具体的に処理しないプログラムの場合でも:

$ mycmd /dev/stdin
Line 1
Line 2
^D

/dev/stdinはOSに関連しているようで、Debian GNU/Linuxで動作しますが、それ以外の場所でも動作するかどうかはわかりません。

4
Axel Beckert