"watch" 명령에서 bash 기능을 실행하는 방법은 무엇입니까?

"watch" 명령에서 bash 기능을 실행하는 방법은 무엇입니까?

bashrc에 함수 f를 정의한다고 가정해 보겠습니다.

function f() {
  date
}

출력을 모니터링하려면 다음 명령을 실행하고 싶습니다 watch f. 명령이 실패하고 "sh:f: 명령을 찾을 수 없습니다". watch bash -c f같은 결과가 나옵니다.

이 watch 명령이 예상대로 작동하도록 하려면 어떻게 해야 합니까?

답변1

watch매 시간 간격마다 새 프로그램을 시작하는 외부 프로그램입니다.

귀하의 경우, sh시작된 기본 쉘이나 명시적으로 시작된 쉘은 bash기능에 대해 알지 못하며 f전달되지 않습니다.

실행하는 항목에 함수 정의를 포함할 수 있습니다. 예를 들어 다음과 같이 쓸 수 있습니다.

#!/bin/bash
function f() {
  date
}
f

텍스트 파일 "myscript.sh"를 작성하고 실행 가능하게 만든 후 사용하십시오 watch ./myscript.sh.

또는 다음을 수행할 수 있습니다.

function f () {
}
typeset -fx f
#   ^---------- modify the type of a name
#        ^----- work only on functions
#         ^---- export to environment
watch -x bash -c "f"
#     ^-------- use `exec` rather than `system` to start bash;
#               makes no sense to start a shell from a shell you
#               only start to start a shell (but omitting -x has
#               no downside other than launching an unnecessary
#               middle layer of `sh`)

watch하위 프로세스가 환경 변수를 상속하므로 bash가 시작 시 알 수 있도록 함수 선언을 환경 변수로 내보냅니다 .

스크립트 옵션을 사용하는 것이 좋습니다. 덜 복잡하고 환경을 어지럽히지 않는데, 이는 놀라운 부작용이 있을 수 있습니다. 성능 이점은 없습니다. 두 경우 모두 셸은 새 하위 셸에서 함수 선언의 소스 코드를 구문 분석합니다.

마지막으로 다음 없이도 할 수 있습니다 watch.

while true ; do
  tput clear # to clear the screen
  f
  sleep 1
done

tput clear스크롤 버퍼가 지워집니다. 이전 콘텐츠가 있으면 먼저 저장하는 것이 좋습니다.

관련 정보