Posso recarregar a variável em um comando watch?

Posso recarregar a variável em um comando watch?

Parte do meu trabalho envolve manipulação de dados. Uma das tarefas é 'achatar' um conjunto de diretórios (que chamaremosDirpor enquanto) e copie-os para um novo local chamado DirFlat.

Isso pode levar muito tempo (30 minutos ->2-3 horas)! Eu gostaria de poder observar o progresso, então eu uso find Dir -type f|wc -lpara obter o número de arquivos (vamos chamar isso $Filenum, e então executo um comando bem curto que escrevi (redigitando do meu notebook, pode ter copiado errado, eu espero que você entenda a essência):

echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)

Porém, se eu executar watch -n 100 "!!"ele pega a saída do echo e continua imprimindo (mesmo a data não muda).

Posso fazer isso para atualizar a variável/executar novamente a atribuição das variáveis ​​internas no BASH? Espero que isso me ajude a automatizar algumas de minhas tarefas.

Responder1

Contraste:

$ watch -n 1 "echo $(date)"
Every 1.0s: echo Sat Apr 27 03:10:50 CEST 2013

$ watch -n 1 'echo $(date)'
Every 1.0s: echo $(date)

O que você fez foi executar echo "($ls DirFlat |wc -l)*100/$FileNum"|bcand date, substituir a saída de cada comando no shell command watch -n 100 "echo $(…) % $(…)"e executá-lo. Você precisa evitar a expansão do comando no shell pai e, em vez disso, passá-lo como uma string para watchque ele seja executado. Esta é uma simples questão de usar aspas simples no comando em vez de aspas duplas.

Responder2

Alternativamente, você pode envolvê-lo em um shell loop:

while sleep 100; do
    (... your stuff ...)
    if [ (... process has finished ...) ]; then
        (... beep or get operator's attention otherwise ...)
        break
    fi
done

Responder3

Você tem que colocar isso em um script de shell e deixar watch chamar esse script.

Responder4

Um loop while com o comando que você deseja executar e o comando sleep também permitirá que você execute o comando linux repetidamente como o comando watch. Embora, neste caso específico, a resposta de @peterph seja melhor, pois possui uma condição final. Esta resposta mais curta responde apenas à pergunta sobre como atualizar ao executar novamente o mesmo processo.

while true; do echo $(date +"%T"); sleep 1; done

O número após dormir está em segundos.

informação relacionada