Stack Overflow:wsadmin.shに複数行のコードを渡すという質問に関連して?。
文字列として、コマンドに入力する必要がある数行の入力があります。ただし、コマンドは入力がいっぱいのファイルのみを受け入れます。
実際にディスクに書き込まれることのない一時ファイルまたはパイプに行を保存し、それをプログラムに直接フィードする方法はありますか?
パイプを取得し、入力をパイプに送り、そのパイプをコマンドに渡し、パイプを削除するにはどうすればよいですか?
Stack Overflow:wsadmin.shに複数行のコードを渡すという質問に関連して?。
文字列として、コマンドに入力する必要がある数行の入力があります。ただし、コマンドは入力がいっぱいのファイルのみを受け入れます。
実際にディスクに書き込まれることのない一時ファイルまたはパイプに行を保存し、それをプログラムに直接フィードする方法はありますか?
パイプを取得し、入力をパイプに送り、そのパイプをコマンドに渡し、パイプを削除するにはどうすればよいですか?
回答:
別の解決策は、Bashでプロセス置換を使用することです。システムに名前付きパイプがある場合、この機能を使用できます。
次のように使用されます。
program_expecting_a_file <(list)
where list
は、一連のシェルコマンドです(実際にはパイプライン。詳細については、こちらを参照してください)。list
が実行され、その出力がパイプに接続されます。その後、パイプの名前がプログラムに渡されます。
注:<
との間にスペースは使用できません(
。
(他の置換>(list)
も期待どおりに機能します。)
あなたの特定のケースでは、使用できます
program_expecting_a_file <(echo "$your_strings")
@meuhのソリューションがよりエレガントであることがわかるかもしれません。
更新:Advanced Bash Scripting Guideで非常に多くの使用例が見つかります。
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/
。
stdin
はありません。そうでない場合、これは機能しません。OPが明確になることを願っています。
"-f" option must be followed by a file name.
-f
ファイル名が必要な場合は、ファイル名を指定します/dev/stdin
。編集をご覧ください。
/dev/stdin
提案のために+1 。呼び出そうとしているプログラムはファイル名のみを受け入れるため/dev/stdin
、heredoc と組み合わせました。
スクリプトの内容によっては、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
-
この方法を解釈するには、プログラムを作成する必要があることに注意してください。これは、シェルまたはオペレーティングシステムの機能ではありません。もちろん、私の知る限り、ほとんどの標準Linuxユーティリティはこの規則に従います。
expect
。
<()
ソリューションに似ていますが、より明示的です-これは非常に便利です!
mycmd -
ソリューションに似た別のオプションがありますが、-
特に処理しないプログラムでも:
$ mycmd /dev/stdin
Line 1
Line 2
^D
/dev/stdin
OS関連であると思われ、Debian GNU / Linuxで動作しますが、他にどこで動作するのかわかりません。
^D
ですか?
^D
Ctrl-Dを押すための一般的な表記法です。^ Dのセマンティクスは、ここでは「入力ストリームの終わり」です。それはおそらく、Ctrl-Zを押すか、Ctrl-Cを押すことを表す、^C
または^Z
Ctrl-Cを押すことを意味します。
/dev/stdin
で何かを入れてから閉じるのでしょうか?
cat content | mycmd /dev/stdin
ます。cat
こことは異なるコマンドを想像してください。