重複の可能性:
シェルプログラミング、一時ファイルを避ける
data.txt
ファイルとコマンドがあるとしましょうcmd
。
cmd
1つのパラメータであるファイルを許可します。またはstdin
。
saydata.txt
は大文字ですが、cmd
すべてのデータが小文字の場合にのみ機能します。
もちろん、これを行うことができます
tr '[:upper:]' '[:lower:]' < data.txt > lowercase_data.txt
cmd lowercase_data.txt
rm lowercase_data.txt
しかし、統合する方法はありますか?
元のファイルの周りのラッパーのようにフィルタを適用し、一時ファイルへの参照を渡し、最後に一時ファイルを削除します。
zshを使用しています。
答え1
zsh
サポートするプロセスの交換、これは要件を満たす必要があります。
A command of the form =(...) is replaced with the name of a file containing its output.
tr
したがって、たとえば、出力をに渡すために一時ファイルを手動で生成したくない場合は、次のように言うことができますcmd
。
cmd =(tr '[:upper:]' '[:lower:]' < data.txt)
他のシェルの場合は次のようになります。
bash
:cmd <(tr '[:upper:]' '[:lower:]' < data.txt)
ksh
:cmd <(tr '[:upper:]' '[:lower:]' < data.txt)
rc
:cmd <{tr '[:upper:]' '[:lower:]' < data.txt}
bash
プロセスの置き換えは、一時ファイルではなく名前付きパイプを使用ksh
して実装されており、マウントされたファイルシステムが必要です。rc
zsh
/dev/fd/
答え2
あなたがやっていることには何の問題もありません。一時ファイルの生成方法を除いて(実行中のスクリプトが同時に2回実行される場合はどうなりますか?)
を使用する必要がありますmktemp
。