2016-12-27 9 views
1

いくつかのデーモンが使用するトリックは、新しく作成された一時ファイルハンドルを開いてファイルシステムから削除してからファイル記述子を実行することです。Linux上のシェルスクリプトで開いているファイルハンドルを保持する方法は?

これはCから行うことができますが、これがシェルスクリプトから可能であるかどうか不思議でしたか?


例は、一時的なバイナリを実行するためのケースを使用する:

  • 一時場所にバイナリをコンパイル。
  • オープンは、その
  • は、ファイル・システム
  • execファイルディスクリプタから削除したファイルハンドル。

このようにしてexecがプロセスを引き継ぎ、テンポラリファイルのクリーンアップについて心配する必要はありません。

+0

これまでに試したことはありますか? – Vandal

+1

いいえ、私はシェルスクリプトから 'fopen'や' open'を呼び出す方法を見ていないので、おそらくそれを行う方法があると思いますが、すべての検索ヒットがCコードの例につながります。 – ideasman42

答えて

1

私は、これはほぼ同等で、かつ非常に簡単だと思う:

cp /path/to/the/executable /tmp/blah 
/tmp/blah arg1 arg2 & 
rm -f /tmp/blah 
wait 

終わりwaitは、バックグラウンド(&)は、ジョブが終了するまでブロックします。

このコードを実行する前に、エラーチェックまたはset -eを追加してください。そうしないと、意図しないものが実行されたり削除されたりする可能性があります。おそらく、blahの代わりに一意の一時ファイル名を生成したいと思うでしょう。

+0

これはかなりうまくいくが、 'exec'とは異なり、これは終了コードを転送せず、シェルプロセスがバックグラウンドで実行し続けるというわずかな欠点がある。 – ideasman42

+0

@ ideasman42:これは、実際には、waitコードが待っているコマンドの終了コードを返すという事実と、Bashがスクリプトの最終コマンドの終了コードを返すという事実によって、終了コードを転送します。あなたが望むなら、最終的にリターンステータスキャプチャを追加することで、より明示的にすることができますが、これは実用的な結果にはなりません。 –

+0

私のテストで何らかの理由でbashを使用しました。私がwaitをしないと、 'wait'は終了コードを返しません。 exit $? ' – ideasman42

関連する問題