私はコマンドライン引数を操作し、最後に別のバイナリを呼び出す前にいくつかのことをするラッパーシェルスクリプトを持っています。最後にexec
バイナリではない理由がありますか?これは、よりシンプルで効率的なようですが、私はそれが完了したことはありません。シェルスクリプトで実行しない理由は何ですか?
3
A
答えて
4
/usr/bin
にチェックを入れると、exec
コマンドで終了する多くのシェルスクリプトが見つかる可能性があります。ただ、一例として、ここでは/usr/bin/ps2pdf
(Debianの)である:それはそれはもはや必要とされているアクティブ後シェルプロセスを維持する必要がなくなるので、
#!/bin/sh
# Convert PostScript to PDF.
# Currently, we produce PDF 1.4 by default, but this is not guaranteed
# not to change in the future.
version=14
ps2pdf="`dirname \"$0\"`/ps2pdf$version"
if test ! -x "$ps2pdf"; then
____ps2pdf="ps2pdf$version"
fi
exec "$ps2pdf" "[email protected]"
exec
私の/usr/bin
ディレクトリには、exec
を使用する150を超えるシェルスクリプトがあります。したがって、exec
の使用が一般的です。
exec
を使用しない理由は、の後にバイナリの実行が終了したことになります。
4
私はあなたの評価ではこれが一般的ではないという意見に同意します。つまり、それはではなく、常にのものです。
私は最後の仕上げで後にコマンドを実行するために、クリーンアップのフックが必要な場合、私は別のコマンドを実行してスクリプトを終了しますが、合理的にexec
を使用することはできません最も一般的なシナリオは、あります。たとえば、
#!/bin/sh
# create a temporary directory
tempdir=$(mktemp -t -d myprog.XXXXXX)
cleanup() { rm -rf "$tempdir"; }
trap cleanup 0
# use that temporary directory for our program
exec myprog --workdir="$tempdir" "[email protected]"
...実行後には実際にはtempdir
がクリーンアップされません。そのexec myprog
を単にmyprog
に変更すると、シェルからのメモリ使用が継続され、追加のプロセステーブルエントリが生成される可能性があります。シグナルは、実行中のプログラムではなくシェルに配信される可能性があります。依然としてmyprog
の出口で、必要なすべてのトラップを実行します。
関連する問題
- 1. NHibernateがSQLを実行しない理由は何ですか?
- 2. プロダクションで 'composer update'を実行しない理由は何ですか?
- 3. BlueJでこれを実行しない理由は何ですか?
- 4. javascriptは何らかの理由で私のマシンで実行したくない
- 5. 私のjQueryが実行されない理由は何ですか?
- 6. ファイルが必要な理由は何ですか?実行されなかった理由
- 7. トランザクションの同時実行が望ましい理由は何ですか?
- 8. 小さいMDBファイルでJETCOMPを実行する理由は何ですか?
- 9. OSX El capitanで何らかの理由でMySQLが実行されない
- 10. シェルスクリプトは、Javaプログラムから実行ではないでしょう
- 11. 実行中に物理アドレスが同じ理由は何ですか?
- 12. Laravelタスクスケジューリングが何もない理由で毎分実行されています
- 13. Angular CLIを使用しない理由は何ですか?
- 14. コントローラーが決して燃えない理由は何ですか?
- 15. カスタムRESTシリアライザが機能しない理由は何ですか?
- 16. requestFocus()が機能しない理由は何ですか?
- 17. インターネットエクスプローラがセッションクッキーを保存しない理由は何ですか?
- 18. AnyObjectを使用しない理由は何ですか?
- 19. ディレクティブがクラスを設定しない理由は何ですか?
- 20. JTextAreaのスクロールバーが機能しない理由は何ですか?
- 21. MyStackがProtoStackに準拠しない理由は何ですか?
- 22. Ajaxで同じ発信元ポリシーを実行する理由は何ですか?
- 23. シェルスクリプト:シェルスクリプトでexitコマンドを実行した後でコマンドを実行
- 24. .htaccessが正確でない理由は何ですか。
- 25. コマンドライン - 「タッチ」を使用できない理由は何ですか?
- 26. この条件が真でない理由は何ですか?
- 27. Redisがアプリケーションサーバー上で実行されていない場合、その理由は何ですか?
- 28. プログラムは実行されず、理由なしで停止する
- 29. 別のシェルスクリプト(OS X)から新しいターミナルウィンドウでシェルスクリプトを実行
- 30. 何らかの理由で(何らかの理由で)CSSグリッドが動作しない
これは、シェルを使用し続けるかどうかによって異なりますか?そうでなければ、 'exec'を使ってください。しかし、プログラム/スクリプトが終了したらシェルを使い続けるには' exec'を使うことができません。たとえば、 [Bashのマニュアルページ](http://man7.org/linux/man-pages/man1/bash.1.html)を見ると、 'exec'コマンド" ...がシェルを置き換える "ということが分かります。 –