0

次のようなコードがあります。

# step through the jobs and execute them one by one
while IFS= read -r job
do
    [ -n "$job" ] && (
        script=$JOBDIR/$job.sh
        ( [ -x $script ] && /bin/sh $script ) || echo `date +%Y-%m-%d` `date +%H:%M:%S` "$script does not exist" >> $JOBFAILS
    )
done < $JOBLIST

これは(AFAIK)次のように書くこともできます:

# step through the jobs and execute them one by one
while IFS= read -r job
do
    if [ -n "$job" ] then
        script=$JOBDIR/$job.sh
        if [ -x $script ] then
            /bin/sh $script || echo `date +%Y-%m-%d` `date +%H:%M:%S` "$script does not exist" >> $JOBFAILS
        fi
    fi
done < $JOBLIST

変数は、存在するテキスト ファイルまたはフォルダーへの参照です。

私の知る限り、() はサブシェルを作成します。これは、括弧内のすべてが別のプロセスで実行されるということですか? そのことによるパフォーマンスへの影響はどのようなものでしょうか? 他に知っておくべき相違点や落とし穴はありますか?

PS: タイトルをもっと「検索しやすい」ように編集していただけると助かります。それは私が思いつくことができる最高の説明です。

4

1 に答える 1

1

あなたは正しいです、サブシェルで( command )実行されます。commandこれには、現在のシェルでコマンドを実行するよりも効率が悪く、リソースを大量に消費する新しいプロセスをフォークする必要があります。コードが分岐する回数に応じて、違いが無視できる場合とそうでない場合があります。

書き換えることができることも正しいです

[ expr ] && command

なので

if [ expr ]; then
    command
fi

then(と同じ行に置く場合ifは、セミコロンを追加する必要があることに注意してください)

コードを変更して、不要なサブシェル呼び出しを取り除くことをお勧めします。私の意見では、それらは よりも効率が悪いだけでなくif...then、コードの読み取りとデバッグが難しくなります。

余談ですが、使用しているシェルのバージョンによっては[、シェルが組み込まれている場合とそうでない場合があります。たとえば、古いバージョンの Bourne シェルを実行している場合、[実際には外部プログラム/bin/[(通常は の単なるエイリアス/bin/test) を呼び出す可能性があります。これにより、関連付けられたオーバーヘッドを持つさらに別のプロセスが生成されます。ただし、最新のシェルを使用している場合は、これについて心配する必要はありません。私の知る限り、最新のシェルはすべて組み込み[コマンドを実装しているためです。

于 2013-09-23T00:34:08.597 に答える