watch 명령에서 명령 출력을 인수로 사용

watch 명령에서 명령 출력을 인수로 사용

나에겐 시계가 있다

jq -r '.' $(ls -t | head -1)"

목표는 디렉토리에서 가장 최근에 수정된 파일에 "jq -r '.'"를 적용하는 것입니다. 안타깝게도 파일이 마지막으로 수정된 시기를 확인하는 데 사용되는 명령은 새로 고칠 때가 아니라 모니터링이 시작될 때 평가됩니다. 새로 고칠 때마다 모든 명령이 재평가되도록 어떻게 작성해야 합니까?

감사해요

답변1

작은따옴표로 명령을 전달하면 watch 명령이 실행될 때가 아니라 감시 주기마다 확장됩니다. 예를 들면 다음과 같습니다.

watch echo $(date)

watch 'echo $(date)'

첫 번째 명령은 원래 날짜를 계속해서 인쇄하고, 두 번째 명령은 date매 주기마다 실행되어 다른 날짜를 인쇄합니다.

이는 리터럴 문자열을 echo $(date)watch 명령에 전달하여 매 주기마다 이를 실행하고 올바른 날짜를 표시하기 때문입니다. 따옴표를 사용하지 않으면 쉘은 $(date)이를 확장하여 date 명령의 출력으로 대체하고 에 전달하므로 watch동일한 출력을 반복해서 인쇄합니다.

답변2

명령의 주요 문제점은 명령을 실행할 때입니다.

watch jq -r '.' "$(ls -t | head -1)"

...명령 대체는 명령의 명령줄 인수를 평가하는 과정의 일부로 한 번 수행됩니다 watch.

명령이 실행될 때마다 평가된 대체 항목으로 명령이 실행되도록 시작 시 현재 쉘이 명령 대체 항목을 평가하는 것을 watch중지 해야 합니다 .watch

당신은 이것을 할 수 있습니다

watch 'jq -r . "$(ls -t | head -1)"'

디렉토리에서 가장 최근에 수정된 일반 파일(아마도 심볼릭 링크됨)은 쉘 *(.om[1])의 파일 이름 글로빙 패턴으로 제공됩니다 zsh. 대괄호는 이전 이름이 일치하는 방법을 한정합니다 *. 점은 일반 파일(심볼릭 링크된 파일일 수 있음)만 선택하고 om마지막으로 수정된 타임스탬프( )를 기준으로 정렬하고 결과 목록에서 첫 번째 이름만 선택합니다.om[1]

따라서 명령을 작성하는 또 다른 방법은

watch -x zsh -c 'jq . *(.om[1])'

여기에서는 -x명령을 실행하는 대신 명령의 이유를 제공합니다.watchexecsh -c

관련 정보