2016-08-29 20 views
3

私はコマンドライン引数を操作し、最後に別のバイナリを呼び出す前にいくつかのことをするラッパーシェルスクリプトを持っています。最後にexecバイナリではない理由がありますか?これは、よりシンプルで効率的なようですが、私はそれが完了したことはありません。シェルスクリプトで実行しない理由は何ですか?

+1

これは、シェルを使用し続けるかどうかによって異なりますか?そうでなければ、 'exec'を使ってください。しかし、プログラム/スクリプトが終了したらシェルを使い続けるには' exec'を使うことができません。たとえば、 [Bashのマニュアルページ](http://man7.org/linux/man-pages/man1/bash.1.html)を見ると、 'exec'コマンド" ...がシェルを置き換える "ということが分かります。 –

答えて

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の出口で、必要なすべてのトラップを実行します。

関連する問題