강타에서 시계를 강제로 실행하는 방법 1: func1: not found 코드는 다음과

문제는 watch가 실행될 때 실행 되고이 sh오류가 발생 한다는 것입니다 .

sh: 1: func1: not found

코드는 다음과 같습니다.

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1


답변

좋아, 그래서 당신의 접근 방식에는 몇 가지 문제가 있습니다.

쉘간에 이식 할 수없는 기능을 내보내고 있습니다. 시스템에없는 watch명령을 실행합니다 . 그리고 쉘이 무엇이든 함수 내보내기를 존중하지 않으므로 오류가 발생합니다./bin/shbash

둘째, 명령을와 같은 것으로 변경할 수 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/shbashbash


예를 들면 :

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