2

ctrl一時ファイルの生成が遅くなる可能性があり、ユーザーが+cを押すと一時ファイルがガベージになると思います。

これが私の元のコードです

for f in bin/* ; do
  ldd $f 2>/dev/null | awk '{print $1}'
done | sort -u | grep -v -e '^not$' -e 'ld-linux' > list.1
while read soname ; do
  process_so_name $soname
done < list.1

一時ファイル list.1 を削除することはできますか?

4

4 に答える 4

5

一時ファイルなしでそれを行うだけです。最後のgrepの結果をwhileにパイプします。

Ctrl + Cを検出するためにSIGINTにフックすることができますが、必要がないのになぜ心配するのでしょうか。それでもSIGKILLに接続することはできません。

for f in bin/* ; do
  ldd $f 2>/dev/null | awk '{print $1}'
done | sort -u | grep -v -e '^not$' -e 'ld-linux' | while read soname ; do
  process_so_name $soname
done

関数にループを配置することで、これをより認識しやすくすることができます(これは、スクリプトファイルまたはシェルで行うことができます)。

step_1() {
  for f in bin/* ; do
    ldd $f 2>/dev/null | awk '{print $1}'
  done
}

step_2() {
  while read soname ; do
    process_so_name $soname
  done
}

step_1 | grep -v -e '^not$' -e 'ld-linux' | step_2

SIGINTにフックするには、次のようにします。

trap "echo SIGINT; rm -f tempfile; exit -1" INT

SIGTERMにフックするには(下のコメントを参照)、次のようにします。

trap "echo SIGTERM; rm -f tempfile; exit -1" EXIT
于 2013-01-26T04:16:22.253 に答える
2

@MihaiDanila さんの正解に加えて、

メインループで統計値を再利用したくない場合は、スクリプトの順序を変更し、プロセス置換を使用する必要があります

total=0
processed=0
while read soname ; do
  ((total=total+1))
  process_so_name $soname && ((processed=processed+1))
done < <(
    for f in bin/* ; do
      ldd $f 2>/dev/null | awk '{print $1}'
    done |
      sort -u |
      grep -v -e '^not$' -e 'ld-linux'
)
printf "Total file %d, processed ok: %d, last filename: '%s'" \
    $total $processed $soname

パイプを使用する構文は、パイプの後にfork... grep -v | while read sonameを実行するように、メイン ループの環境が最後にドロップされます。

見る:man -Len -Pless\ -i\ +/^\\\ *process\\\ substitution$ bash

于 2013-01-26T08:31:38.457 に答える