문제는 시계가 실행될 때 시계가 실행되고 sh
다음 오류가 발생한다는 것입니다.
sh: 1: func1: not found
코드는 다음과 같습니다.
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
답변1
기본 쉘 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!
답변2
좋습니다. 접근 방식에 몇 가지 문제가 있습니다.
쉘 간에 이식할 수 없는 함수를 내보내고 있습니다. 시스템에 없는 watch
명령을 실행하는 데 사용합니다 . 어떤 쉘이든 함수 내보내기를 존중하지 않으므로 오류가 발생합니다./bin/sh
bash
둘째, 명령을 비슷한 것으로 변경할 수 있지만 watch bash -c 'func1'
그 역시 제대로 작동하지 않을 수 있습니다.
그 이유는 스크립트에 의해 설정된 변수를 함수에서 사용할 수 없기 때문입니다. 필요한 것을 내보낼 수도 있지만 혼란스러워지기 시작합니다.
가장 안전한 해결책은 func1
별도의 스크립트를 넣고 해당 스크립트를 호출하는 것입니다.
즉, 다음을 시도해 보십시오.
watch bash -c func1
답변3
watch
스크립트 내부에서 실행하는 이유는 무엇입니까? 이 쉘 스크립트를 사용하지 않는 이유:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
...그리고 이렇게 실행해 보세요...
$ watch func1 foo