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
스크롤 버퍼가 지워집니다. 이전 콘텐츠가 있으면 먼저 저장하는 것이 좋습니다.