これを実装する方法を覚えていません。ユーザーが一時使用のためにコマンドにプレーンテキストを含めることをサポートしたいと思います。
ここでは file.json ファイルから読み込みます。
lp_solve --method='simplex' --problem='<file.json>'
しかし、ユーザーがプロセス置換を使用してjsonインラインを作成できることを願っています。
lp_solve --method='exhaustive' --problem=<(echo '
{"foo":"bar","this":"is json"}
')
クロスプラットフォームになれますか? 「<()」の周りに引用符が必要ですか?
ベストアンサー1
シェルがbash、zsh、またはksh93の最新バージョンであり、ビルド時にこの機能が無効になっていないと仮定すると、
lp_solve --method='simplex' --problem=<(echo 'something')
パイプの読み取りの終わりを識別する最後の引数lp_solve
として呼び出されます。元のksh実装、名前付きパイプまたは 。--problem=/path/to/some/file
/path/to/some/file
/dev/fd/n
/proc/self/fd/n
他のシェルはプロセス置換をサポートしていないか、他の構文(<{cmd}
rcに似たシェルで(cmd | psub)
in fish
)や<(cmd)
他の目的(プロセスのリダイレクトyash
や<
リダイレクト後のコマンドの置き換えなどfish
)を使用してそれをサポートします。
ファイルがパイプであるという事実にはいくつかの意味があります。つまり、通常のファイルの 1 対 1 の置き換えでは常に使用できません。
- アプリケーション(ここ
lp_solve
)はファイル内にありません。 - 一度読んだ後、アプリケーションで再度開くと空白になります。
- ファイルに書き込もうとすると失敗したり、期待どおりに動作しません。
zsh と Fish には、一時的な汎用ファイルを使用するプロセス置換形式があります。
... --problem==(echo '...')
(zsh)... --problem=(echo '...' | psub -f)
(魚)
"$(echo ... | psub)"
最新バージョンを除外すると、fish
引用符内でプロセスの置き換えが行われないため、次のことができます。いいえ周りに引用符を使用したいです。
Bashでも、任意のテキスト、特に文字を含むテキスト(jsonで一般的)echo
に移植性がないことに注意してください。\
を使用したい場合がありますprintf
。
--problem
ファイルをパラメータとして使用するだけでなく、json文字列をパラメータとして使用することもあります。わかり--problem-file=file.json
ました--problem='{"some": "json"}'
。または、json文字列はで始めることができないため、@
いくつかcurl
のオプションとhasと--problem='{"some": "json"}'
同様の操作を実行します[email protected]
。
1つのプロセスの交換は80年代半ばのkshで行われましたが、サポートされている/dev/fd/n
システムでのみ使用でき、拡張はパラメータの一部にすることはできません。--problem <(cmd)
うまくいきましたが、うまくいきません--problem=<(cmd)
(比較的新しいksh93バージョンまではまだ動作します)。
configure
² Bash で--disable-process-substitution
スクリプトを使用または呼び出す場合は、プロセスの置き換えを無効にします。--enable-minimal-config