シミュレートされたファイルの置き換えプロセス

シミュレートされたファイルの置き換えプロセス

これを実装する方法を覚えていません。ユーザーが一時使用のためにコマンドにプレーンテキストを含めることをサポートしたいと思います。

ここでは 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

答え2

ノート

私はlp_solveこれです数学プログラムなので、以下のコードは目的の方法で機能しません。これは、プログラムにパス名が必要なためです。


プロセス置換を使用するときは、標準入力からスクリプトに渡される内容を読む必要があります(パイプと同じだと思います)。

lp_solveカスタムプログラミング/シェルスクリプト(bashなど)の場合は、次のように標準入力を読み取る必要があります。

#!/usr/bin/bash
echo Data:
cat

パスするには、次のstdinものを使用する必要があります。

lp_solve --method='simplex' --problem=< <(echo Fuzz)
#Output:
Data:
Fuzz

ただし、上記のように、パラメータではなくパラメータとして< <(echo Fuzz)扱われるため、stdinどの変数も読み取れません$N

スクリプトにパラメーターとして渡すには、以下を使用する必要があります。

lp_solve --method='simplex' --problem='
{"foo":"bar","this":"is json"}
{"foo":"buzz","this":"is json"}
{"foo":"foo","this":"is json"}
etc...
'

入力するときはlp_solve --method='simplex' --problem='Enterを押す必要があります。十分あなたの文字列。ちなみに、文字列を入力すると完了ですので
使用時には注意してください。たとえば、--problem=''

lp_solve --method='simplex' --problem='
this is a text
this is a'text
#Output:
this is a text
this is atext

ご覧のとおり'削除されました。他のシェルでは、動作が異なっているかスクリプトが失敗する可能性があると想定しています。

関連情報