나에겐 시계가 있다
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
마지막으로 수정된 타임스탬프( )를 기준으로 정렬하고 결과 목록에서 첫 번째 이름만 선택합니다.o
m
[1]
따라서 명령을 작성하는 또 다른 방법은
watch -x zsh -c 'jq . *(.om[1])'
여기에서는 -x
명령을 실행하는 대신 명령의 이유를 제공합니다.watch
exec
sh -c