bash에서 시계를 강제로 실행하는 방법

bash에서 시계를 강제로 실행하는 방법

문제는 시계가 실행될 때 시계가 실행되고 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/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!

답변2

좋습니다. 접근 방식에 몇 가지 문제가 있습니다.

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

둘째, 명령을 비슷한 것으로 변경할 수 있지만 watch bash -c 'func1'그 역시 제대로 작동하지 않을 수 있습니다.
그 이유는 스크립트에 의해 설정된 변수를 함수에서 사용할 수 없기 때문입니다. 필요한 것을 내보낼 수도 있지만 혼란스러워지기 시작합니다.

가장 안전한 해결책은 func1별도의 스크립트를 넣고 해당 스크립트를 호출하는 것입니다.
 

즉, 다음을 시도해 보십시오.

watch bash -c func1

답변3

watch스크립트 내부에서 실행하는 이유는 무엇입니까? 이 쉘 스크립트를 사용하지 않는 이유:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

...그리고 이렇게 실행해 보세요...

$ watch func1 foo

관련 정보