문제는 watch가 실행될 때 실행 되고이 sh
오류가 발생 한다는 것입니다 .
sh: 1: func1: not found
코드는 다음과 같습니다.
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
문제는 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
.bash_profile
.bash_profile
파일이 비교적 비어 있는 환경에서 사물을 모니터링하기위한 훌륭한 명령입니다 . 그러나 내 .bash_aliases
파일 에있는 별칭 ( my을 통해 소스.bashrc
) 을 실행하고 싶었 으므로 -i
플래그를 bash에 추가했습니다 . 나는 그것이 누군가를 도울 것이라고 생각했다 :watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
우분투 서버 16.04 에서만 나를 위해 일하십시오-다른 사람들은 그렇지 않습니다.
의 기본 쉘은 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 -x bash -c my-func
네 우분투 서버 16.04에서 나를 위해이 작품 - 다른 사람은하지 않지만. 엄청 고마워!