除去作成した温度のファイルをぬbash口
-
22-08-2019 - |
質問
私は一時ファイル作成からbashを記述します。私は削除の終了処理ではスクリプトが実行のためのかなりの長期間の場合だったというのではなCTRL-Cでの走行中の温度のファイルが削除されません。
があるので、できれイベントやクリーンアップファイルの前に実行終了?
また、かのベストプラクティスのネーミングと地温のファイル?
っていないと利用:
TMP1=`mktemp -p /tmp`
TMP2=`mktemp -p /tmp`
...
や
TMP1=/tmp/`basename $0`1.$$
TMP2=/tmp/`basename $0`2.$$
...
かがより良いソリューション?
解決
あなたは上で実行するために、「トラップを」設定することができます終了するか、Control-Cを上クリーンアップする。
trap "{ rm -f $LOCKFILE; }" EXIT
また、私の好きなUNIX-ISMSの一つは、ファイルを開き、あなたはまだそれが開いている間、それを削除することです。ファイルは、ファイルシステム上にとどまり、あなたはそれを読み書きすることができますが、できるだけ早くお使いのプログラムの終了など、ファイルが消えます。あなたがが、bashでそれを行うだろうかわからない。
ところで:私はmktempを賛成の代わりに、独自のソリューションを使用してあげる一つの引数:ユーザーがあなたのプログラムは、巨大な一時ファイルを作成しようとしている予想していた場合は、彼は、どこかに大きなに設定TMPDIR
をお勧めしますの/ var / tmpなど。 mktempをあなたの手巻き溶液(第二の選択肢は)ない、ということを認識しています。私は頻繁に、たとえば、TMPDIR=/var/tmp gvim -d foo bar
を使用します。
他のヒント
私は通常、スクリプトが終了したときに、このディレクトリをクリーンアップするためにEXITハンドラーを作成し、直後にすべての私の一時ファイルを配置するディレクトリを作成し、かつます。
MYTMPDIR=$(mktemp -d)
trap "rm -rf $MYTMPDIR" EXIT
あなたは$MYTMPDIR
の下に、すべての一時ファイルを置く場合は、あなたのスクリプトは、ほとんどの状況で終了したときに、それらはすべて削除されます。 (殺す-9)SIGKILLでプロセスを強制終了するものの、すぐにプロセスを殺すので、あなたのEXITハンドラは、その場合には実行されません。
あなたはトラップのコマンドを使用しますCTRL-Cのようなスクリプトまたは信号を出処理します。 GregのWikiの詳細はを参照してください。
あなたの一時ファイルのために、basename $0
を使用することは良いアイデアだけでなく、十分な一時ファイルのための部屋を提供したテンプレートを提供しています:
tempfile() {
tempprefix=$(basename "$0")
mktemp /tmp/${tempprefix}.XXXXXX
}
TMP1=$(tempfile)
TMP2=$(tempfile)
trap 'rm -f $TMP1 $TMP2' EXIT
ただ、答えを選びだしことに留意してください。
のような溶液を意味bashism
、あります
trap "{ rm -f $LOCKFILE }" EXIT
のみbashで動作します(シェルがdash
またはクラシックsh
であれば、それはCtrlキー+ cをキャッチしません)が、あなたは、互換性を望むならば、あなたはまだ罠にしたいすべての信号を列挙する必要があります。
また、スクリプトは信号「0」(別名EXIT)のトラップを終了すると、常にtrap
コマンドの二重の実行結果として実行されること。
EXIT信号があれば理由が一列にすべての信号をスタックにないこと。
より良い、それは変更することなく、異なるシステム間で動作するスクリプトを以下で見て理解するために:
#!/bin/sh
on_exit() {
echo 'Cleaning up...(remove tmp files, etc)'
}
on_preExit() {
echo
echo 'Exiting...' # Runs just before actual exit,
# shell will execute EXIT(0) after finishing this function
# that we hook also in on_exit function
exit 2
}
trap on_exit EXIT # EXIT = 0
trap on_preExit HUP INT QUIT TERM STOP PWR # 1 2 3 15 30
sleep 3 # some actual code...
exit
あなただけの最終の出口(preExit
機能)の前に実際の信号の発生にあなたのコードの一部を実行することができ、それが必要な場合は、実際のEXIT信号(出口の最終段階)で、いくつかのコードを実行することができますので、このソリューションはより多くの制御を与えます
代替の利用を予測可能なファイル名を$$がぽっかりセキュリティホールとすべきとは絶対にあって、考えて使用しています。でも簡単に個人のスクリプトにはシングルユーザーのパソコン。で非常に悪い癖では手に入れることができます。 BugTraq がいっぱいの"安全でない一時ファイル"が望まれる。見 こちらの, こちらの や こちらの 詳しい情報のセキュリティ面の温度のファイルです。
また、当初考えてい引用の不安定なTMP1とTMP2課題が設定されてても良いと思うことでしょう なってみても良さそうな.
私は安全な方法ででは/ tmpファイルを作成し、その命名を心配する必要はありませんtempfile
を使って好みます:
tmp=$(tempfile -s "your_sufix")
trap "rm -f '$tmp'" exit
あなたはmktempをして作成されたものtmpのファイルを削除する気にする必要はありません。彼らはとにかく、後に削除されます。
あなたができるならば、それはより多くのユニークなファイルを生成して、し、「$$」プレフィックスをmktempを使用してください。そして、それは、明示的に/ tmpに入れて一時ファイルを作成するために、より多くのクロスプラットフォームな方法のように見えます。