watch 명령에서 변수를 다시 로드할 수 있나요?

watch 명령에서 변수를 다시 로드할 수 있나요?

내 업무에는 일부 데이터 처리가 포함됩니다. 작업 중 하나는 일련의 디렉터리를 '평면화'하는 것입니다.디렉토리지금은) DirFlat이라는 새 위치에 복사하세요.

시간이 오래 걸릴 수 있습니다(30분 -> 2~3시간)! 진행 상황을 보고 싶기 때문에 find Dir -type f|wc -l파일 수를 가져오는 데 사용합니다(이것을 호출한 $Filenum다음 제가 작성한 매우 짧은 명령을 실행합니다(노트북에서 다시 입력하면 잘못 복사했을 수 있습니다. 요점을 이해하시기 바랍니다):

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

그러나 실행하면 watch -n 100 "!!"에코의 출력을 가져와 계속 인쇄합니다(날짜는 변경되지 않음).

BASH에서 변수를 새로 고치거나 내부 변수 할당을 다시 실행하도록 할 수 있습니까? 이것이 내 작업 중 일부를 자동화하는 데 도움이 되기를 바랍니다.

답변1

차이:

$ 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)

당신이 한 일은 and 를 실행 echo "($ls DirFlat |wc -l)*100/$FileNum"|bc하고 date, 각 명령의 출력을 쉘 명령으로 대체하고 watch -n 100 "echo $(…) % $(…)", 그것을 실행하는 것입니다. 상위 셸에서 명령이 확장되는 것을 방지하고 대신 watch실행되도록 문자열로 전달해야 합니다 . 이는 큰따옴표 대신 명령 주위에 작은따옴표를 사용하는 간단한 문제입니다.

답변2

또는 이를 쉘 루프로 래핑할 수 있습니다.

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

답변3

이것을 쉘 스크립트에 넣고 watch가 이 스크립트를 호출하도록 해야 합니다.

답변4

실행하려는 명령과 sleep 명령이 포함된 while 루프를 사용하면 watch 명령처럼 linux 명령을 반복적으로 실행할 수도 있습니다. 하지만 이 특정한 경우 @peterph의 답변은 종료 조건이 있기 때문에 더 좋습니다. 이 짧은 응답은 동일한 프로세스를 다시 실행할 때 새로 고치는 방법에 대한 질문에만 답변합니다.

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

수면 후의 숫자는 초 단위입니다.

관련 정보