Os aviões são sempre reabastecidos no solo?
Bem, claro que você pensa. Mas, 0,001% do tempo eles são reabastecidos no ar. Aplicações militares por exemplo. Então a regra não é firme. O mesmo acontece com arquivos executáveis e scripts. Os vírus, por exemplo, infectam os executáveis enquanto eles estão em execução e a cópia no disco também. Isso é bom se eles quebrarem. No entanto, os não-vírus também podem atualizar executáveis / scripts.
Exemplo de script que se atualiza
Este script: Como posso fazer com que um script faça o login em um arquivo separado o número de vezes que ele foi executado? se atualiza com o número de vezes que ele foi executado foi executado.
Convencionalmente, um arquivo de configuração separado é usado para cada arquivo de script para registrar quantas vezes ele é executado. Mas se você tiver dezenas e dezenas de scripts, faz sentido armazenar a contagem de execução no próprio script. Além disso, você não precisa controlar onde o arquivo de configuração está armazenado e alterar o script se o arquivo de configuração for movido. O código para modificar a contagem de execuções pode ser incluído com o comando source
ou .
bash para reduzir os custos de manutenção e melhorar a legibilidade.
Snippet de código
Este é o código relevante do link acima:
# 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"
Quebrando o código
Explicarei rapidamente como as partes de código exclusivas funcionam.
mapfile -t ScriptArr < "$0"
^ Isto lê todo o script /script/path/script-name.sh
no array chamado ScriptArr
.
OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 )
NewCnt=$(( $OldCnt + 1 ))
ScriptArr[i]=$SearchStr$NewCnt
^ Isso leva a contagem antiga na linha de comentário: # This script run count: 0
e aumenta em 1.
printf "%s\n" "${ScriptArr[@]}" > "$0"
^ Isso grava o array de script modificado no disco como o novo script executável. Um bom efeito colateral (ou ruim) é a data em que o script foi executado pela última vez agora é a data de modificação dos scripts.
Considerações sobre vários usuários
Observe a variável FLOCKER
do comando acima:
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
^ Isso é para vários usuários. Se um usuário estiver executando o script, ele impedirá que um segundo usuário execute o mesmo script. Digamos que você espere até que o trabalho do primeiro usuário termine e mova o script. Isso é ruim porque o segundo usuário que estava no modo de espera agora obtém acesso para executar o script porque o bloqueio do semáforo é descartado. No entanto, após o término do trabalho do primeiro usuário, você moveu o script para um diretório diferente. Não é grande coisa 99,999% das vezes, mas são os momentos extremamente raros que são os insetos insondáveis.
Resumo
Um script ou executável em execução pode mudar a si mesmo ou até mesmo alterar outro programa que não está em execução no mesmo aplicativo.
Em geral, é 99% seguro mover (renomear) um programa que já está em execução. Dito isso, eu nunca faria isso.
Sua pergunta é sobre wine
(pseudo-Windows), mas esses scripts bash foram criados para o Ubuntu no Linux e no Ubuntu no Windows (WSL). O ponto não é muito sobre wine
, mas para mostrar o que pode ser feito no mundo da programação / scripting.