문제는 watch가 실행될 때 실행 되고이 sh
오류가 발생 한다는 것입니다 .
sh: 1: func1: not found
코드는 다음과 같습니다.
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
답변
좋아, 그래서 당신의 접근 방식에는 몇 가지 문제가 있습니다.
쉘간에 이식 할 수없는 기능을 내보내고 있습니다. 시스템에없는 watch
명령을 실행합니다 . 그리고 쉘이 무엇이든 함수 내보내기를 존중하지 않으므로 오류가 발생합니다./bin/sh
bash
둘째, 명령을와 같은 것으로 변경할 수 watch bash -c 'func1'
는 있지만 제대로 작동하지 않을 수도 있습니다.
스크립트에서 설정 한 변수를 함수에서 사용할 수 없기 때문입니다. 필요한 것을 내보낼 수는 있지만 지저분 해지기 시작합니다.
가장 안전한 해결책은 func1
스크립트 자체 를 넣고 해당 스크립트를 호출하는 것입니다.
간단히 말해 다음을 시도하십시오.
watch bash -c func1
답변
의 기본 쉘은 watch
입니다 /bin/sh
. 쉘은 다른 유형의 쉘에서 내 보낸 변수 또는 함수를 상속하지 않습니다.
시스템이 심볼릭 링크하지 않는 경우 /bin/sh
에 /bin/bash
(또는 현재 쉘) 당신은 지시 할 수 있습니다 watch
사용하여 쉘을 간부 인하는 -x
나 --exec
:
watch -x bash -c "my_func"
또는
watch --exec bash -c "my_func"
자식 프로세스 (이 경우 ) 를 생성하여 사용하지 않으므로 watch bash -c "test_watch"
(제외 --exec
)와 다릅니다 . 다른 답변에서 알 수 있듯이 현재 환경과 밀접하게 연결된 기능을 내보내는 경우 (즉, 다른 변수 또는 기능이 필요한 경우) 지저분해질 수 있습니다./bin/sh
bash
bash
예를 들면 :
test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"
익숙한
Every 2.0s: bash -c test_watch Thu Mar 31 11:15:56 2016
Working!
답변
왜 watch
스크립트 안에서 실행 합니까? 이 쉘 스크립트가없는 이유 :
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
… 그리고 그렇게 실행하십시오 …
$ watch func1 foo