別のスクリプト(B)によって呼び出されているシェルスクリプト(A)があります。このスクリプト(A)では、スクリプトの残りの部分が正常に機能するための準備作業として、いくつかのディレクトリを作成し、いくつかのファイルを移動しています。Script(A)はscript(B)によって反復的に呼び出されます。ディレクトリの作成とファイルの移動は、最初のループで1回だけ実行する必要があります。
スクリプトの一部を1回だけ実行するにはどうすればよいですか?
信頼できる環境の比較的ユニークな品質が必要です。これを実現するのは簡単ではありません。特に、ループ内で個別のスクリプトを繰り返し呼び出しており、発生するたびに動作が異なると予想される場合(その場合、同じスクリプトの一部ではないのはなぜですか?)。
とにかく、一般的に行うことは、これらの種類のものにロックファイル(またはそのようなもの)を使用することです。ただし、これを行うには、その独自の環境が必要です。次のことを考慮してください。
sh -c 'echo "$PPID" "$$"
for i in 1 2 3 4 5
do sh -c "echo \"\$PPID\""
done'
25711 28929
28929
28929
28929
28929
28929
呼び出し元が環境変数$PPID
でpidを提供することに依存できる場合は、それがまさに必要なものである可能性があります。例えば:
#!/bin/sh
#script a
LOCKDIR=${TMPDIR:-/tmp}/${0##*/}.$PPID
init() { mkdir "$LOCKDIR" || exit
# do other initialization tasks
}
loop() { : do the iterable tasks here; }
[ -d "$LOCKDIR" ] || init
loop
...そして...
#!/bin/sh
#script b
a='/path/to/script/a'
for stuff in $things
do "$a" "$stuff"
done
rm -rf "${TMPDIR:-/tmp}/${a##*/}.$$"
しかし、真剣に、私はこの種のことを行うことが良い考えである多くの状況にまったく遭遇していません-私が別のシェルスクリプトを繰り返し呼び出していて、その環境に依存しなければならない場合、私はおそらく.
スクリプトの内容を現在のシェルをそのように実行します。私がいた場合、私は、あること、これを行うだろう非常に確認してください、私が実行していたスクリプトがしっかり書かれていました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加