ファイルから入力を受け取るプログラムがあり、XML
ファイルパスがパラメーターとして指定されます。私は私のシェルスクリプトが独立していることを望んでいるので、ここにあるドキュメントが正しいアプローチであるようです。残念ながら、プログラムは入力を受け入れないため、STDIN
パイプは機能しません。
私はここで文書を読んだ。ドキュメントはファイルとして実装されているので、/tmp
方法があると思いました。
私のXMLファイルを私のシェルスクリプトにインライン化し、XMLパーサーが使用できるパスを取得する方法はありますか?
答え1
シェルがプロセス置換(bash、zsh、ksh88、ksh93)をサポートしている場合は、次のものを使用できます。
your_command <( cat <<EOF
contents of the
xml file
EOF
)
この<(...)
セクション全体は、コマンドの出力をcat <<EOF
FIFOに接続してから、現在のコマンドに引数として渡されます。
しかし、より移植性の高い方法は、内容を含む一時ファイルを作成して削除することです。
答え2
ここで、シェルがドキュメントを実装する方法はシェルによって異なり、後で使用される内容はランタイム要素によって異なります。たとえば、シェルは、bash
システムパイプサイズよりも短いドキュメントを処理するために、シェルプロセス内のパイプを使用しようとします。
/dev/fd/0
ほとんどのUnixシステムで読み取ることで、標準入力ストリームにアクセスできます/dev/stdin
。これらの機能が利用可能であるという保証はありませんが、今日最も一般的に使用されているUnixシステムではこれを実装しています。
標準入力ストリームにデータを提供しながら、これらのパス名のいずれかを使用してコマンドにパス名を指定すると、問題は解決されます。
thecommand /dev/stdin <<'END_XML'
Some XML document
goes here.
END_XML
/dev/stdin
コマンドが特定のファイルを検索する必要がない限り、このように使用すると機能します。その場合、一時的に実際のファイルに入力を書き込むことができます。
tmpfile=$(mktemp) || exit
cat <<'END_XML' >"$tmpfile"
Some XML document
goes here.
END_XML
thecommand "$tmpfile"
rm "$tmpfile"
これらの特殊パス名のいずれかでこの文書を使用することは、次のような他のコマンドに一時的な入力を提供する便利な方法でもあります。
sed -f /dev/stdin file <<'END_SED'
Some sed script
goes here
END_SED
答え3
インタプリタは、解釈されるソースから「ここ」のドキュメントを読み、それを入力を取得するコマンドに入力することでうまく動作します(一時ファイルを使用する面倒を避けるためにとにかく私がすることです)。それにもかかわらず、どのメカニズムを使用しても文書化されていないようで、いつでも変更される可能性があります。特に、他のシェルが/bin/sh
同じように動作するという保証はありません。
答え4
-
1つの方法は、次のようにstdinとheredocsの省略形式を使用することです。
command - <<EOF
<file>
<contents />
</file>
EOF