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


18

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

sh: 1: func1: not found

코드는 다음과 같습니다.

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1

실제로 어떤 명령을 실행할 수 있습니까?
cuonglm

echo $ 1 대신 @Gnouc 나는 약간 긴 스크립트를 가지고 있으므로 모르겠다 ..
Rachid Oussanaa

ssh 명령을 어떻게 실행 했습니까?
cuonglm

@Gnouc ./bin/myfunc.sh
Rachid Oussanaa

답변:


10

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

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

둘째, 명령을와 같은 것으로 변경할 수 watch bash -c 'func1'는 있지만 제대로 작동하지 않을 수도 있습니다.
스크립트에서 설정 한 변수를 함수에서 사용할 수 없기 때문입니다. 필요한 것을 내보낼 수는 있지만 지저분 해지기 시작합니다.

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

간단히 말해 다음을 시도하십시오.

watch bash -c func1

1
기능이 다음과 같이 정의 된 경우 CPU를 매우 많이 사용합니다.bash_profile
VarunAgw

@VarunAgw, 좋은 지적입니다. 그러나 .bash_profile파일이 비교적 비어 있는 환경에서 사물을 모니터링하기위한 훌륭한 명령입니다 . 그러나 내 .bash_aliases파일 에있는 별칭 ( my을 통해 소스.bashrc ) 을 실행하고 싶었 으므로 -i플래그를 bash에 추가했습니다 . 나는 그것이 누군가를 도울 것이라고 생각했다 :watch bash -ic "func1; alias1; func2; …"
aaiezza

watch -x bash -c my-func우분투 서버 16.04 에서만 나를 위해 일하십시오-다른 사람들은 그렇지 않습니다.
Nam G VU

14

의 기본 쉘은 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 -x bash -c my-func네 우분투 서버 16.04에서 나를 위해이 작품 - 다른 사람은하지 않지만. 엄청 고마워!
Nam G VU

4

watch스크립트 안에서 실행 합니까? 이 쉘 스크립트가없는 이유 :

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... 그리고 그렇게 실행하십시오 ...

$ watch func1 foo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.