Ubuntuでは、
実行可能ファイルまたはスクリプトファイルを実行しているときに、ファイルを移動または名前変更すると、実行に影響がありますか?
wineでWindows実行可能ファイル(たとえば PDFXCview.exe )を実行する場合、Windows実行可能ファイルを移動または名前変更すると、wineでの実行に影響しますか?
ありがとう。
もちろんそう思います。しかし、空中で給油される時間の0.001%です。たとえば、軍事用アプリケーション。したがって、ルールは不動のものではありません。同じことが実行可能ファイルとスクリプトにも当てはまります。たとえば、ウイルスは実行中に実行可能ファイルに感染し、ディスク上のコピーも感染します。彼らが壊れたらそれは良いことです。ただし、非ウイルスは実行可能ファイル/スクリプトも更新できます。
このスクリプト: スクリプトが実行された回数だけ別のファイルにログインさせるにはどうすればよいですか? 実行された回数で自身を更新します。
従来は、スクリプトファイルごとに個別の構成ファイルを使用して、実行回数を記録していました。しかし、数十個のスクリプトがある場合は、スクリプト自体に実行カウントを保存するのが理にかなっています。また、構成ファイルが保存されている場所を追跡したり、構成ファイルが移動した場合にスクリプトを変更したりする必要はありません。実行カウントを変更するコードをsource
または.
bashコマンドに含めて、メンテナンスコストを削減し、可読性を向上させることができます。
上記のリンクからの関連コードは次のとおりです。
# This script run count: 0
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
# This is useful boilerplate code for Shell scripts. Put it at the top of
# the Shell script you want to lock and it'll automatically lock itself on
# the first run. If the env var $FLOCKER is not set to the Shell script
# that is being run, then execute flock and grab an exclusive non-blocking
# lock (using the script itself as the lock file) before re-execing itself
# with the right arguments. It also sets the FLOCKER env var to the right
# value so it doesn't run again.
# Read this script with entries separated newline " " into array
mapfile -t ScriptArr < "$0"
# Build search string that cannot be named
SearchStr="This script"
SearchStr=$SearchStr" run count: "
# Find our search string in array and increment count
for i in ${!ScriptArr[@]}; do
if [[ ${ScriptArr[i]} = *"$SearchStr"* ]]; then
OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 )
NewCnt=$(( $OldCnt + 1 ))
ScriptArr[i]=$SearchStr$NewCnt
break
fi
done
# Rewrite our script to disk with new run count
# BONUS: Date of script after writing will be last run time
printf "%s\n" "${ScriptArr[@]}" > "$0"
独自のコード部分がどのように機能するかを簡単に説明します。
mapfile -t ScriptArr < "$0"
^これはスクリプト/script/path/script-name.sh
全体をScriptArr
という名前の配列に読み込みます。
OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 )
NewCnt=$(( $OldCnt + 1 ))
ScriptArr[i]=$SearchStr$NewCnt
^これはコメント行の古いカウントを取ります:# This script run count: 0
そして1ずつ増加します。
printf "%s\n" "${ScriptArr[@]}" > "$0"
^これにより、変更されたスクリプト配列が新しい実行可能スクリプトとしてディスクに書き込まれます。良い(または悪い)副作用は、スクリプトが最後に実行された日付がスクリプトの変更日になることです。
上記のコマンドのFLOCKER
変数に注目してください。
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
^これは複数のユーザー向けです。 1人のユーザーがスクリプトを実行している場合、2人目のユーザーがまったく同じスクリプトを実行するのを停止します。最初のユーザーのジョブが終了するまで待ってから、スクリプトを移動するとします。セマフォロックが解除されるため、待機モードになっていた2番目のユーザーがスクリプトを実行するためのアクセス権を取得するため、これは悪いことです。ただし、最初のユーザーのジョブが終了した後、スクリプトを別のディレクトリに移動しました。たいした99.999%の時間ではありませんが、計り知れないバグは非常にまれな時間です。
実行中のスクリプトまたは実行可能ファイルは、それ自体を変更することも、同じアプリケーション内で実行されていない別のプログラムを変更することもできます。
一般的に言って、すでに実行中のプログラムを移動(名前変更)することは99%安全です。それは私がそれを決してしないと言った。
あなたの質問はwine
(擬似Windows)についてですが、これらのbashスクリプトはLinux下のUbuntuおよびWindows下のUbuntu(WSL)用に設計されています。ポイントはwine
についてではなく、プログラミング/スクリプトの世界で何ができるかを示すことです。