2012-07-10 4 views
3

이것은 내가 겪고있는 문제를 단순화하기위한 것입니다. 나는 변수를 설정하는 함수를 정의하고이이 시나리오에서 작동 :파이프의 일부일 때 배시 기능이 실패합니다.

$ function myfunc { res="ABC" ; } 
$ res="XYZ" 
$ myfunc 
$ echo $res 
    ABC 

그래서 입술 MYFUNC에 대한 호출에 의해 변경되었습니다. 그러나 :

$ res="XYZ" 
$ myfunc | echo 
$ echo $res 
    XYZ 

따라서 myfunc가 파이프의 일부일 때 값은 변경되지 않습니다. 파이프가 관련되어 있어도 myfunc가 원하는 방식으로 작동하도록하려면 어떻게해야합니까?

이 불가능

감사

+2

아마 'myfunc | echo'는 새로운 프로세스에서 호출되는 반면, 첫 번째 경우에는'myfunc'가 현재 프로세스에서 호출됩니다. – cnicutar

답변

4

(실제 스크립트 "에서 myfunc"에서 더 많은 물론 정교하고 파이프의 다른 쪽 뭔가가 zenity 진행 대화보다는 무의미 에코을 가지고 않습니다) 유닉스에서. 이를 더 잘 이해하려면 변수가 무엇인지 알아야합니다. Bash는 정의 된 모든 변수가있는 두 개의 내부 테이블을 유지합니다. 하나는 현재 셸의 로컬 변수입니다. set name=value 또는 단지 name=value으로 만들 수 있습니다. 이것들은 프로세스의 지역적이다. 새로운 프로세스가 생성 될 때 상속되지 않습니다.

변수를 새 하위 프로세스로 내보내려면 export name으로 내 보내야합니다. 그것은 bash에게 "나는이 변수의 가치를 아이들이 보길 원한다"고 말한다. 그것은 보안 기능입니다.

bash에서 함수를 호출하면 현재 셸의 컨텍스트 내에서 실행되므로 모든 변수에 액세스하고 수정할 수 있습니다.

그러나 파이프는 I/O 파이프와 연결된 프로세스 목록입니다. 즉, 함수가 쉘에서 실행되고이 쉘의 출력 만 echo에 표시됩니다.

에도 수출 내보내기를하고 echomyfunc 같은 쉘에 의해 시작된 셸에 의해 시작 프로세스에 대해서만 작동하기 때문에 작동하지 않을 것입니다 myfunc에 수출 : echo입니다

bash 
+-- myfunc 
+-- echo 

은 아니다 자식은 myfunc입니다.

해결 방법 :

  1. 출력의 첫 번째 줄은 항상 변수와 실제 출력되는 파일
  2. 를 사용하여 XML 또는 여러 라인과 같은 더 복잡한 출력 형식으로 변수를 쓰기는 다음에 온다 선.
+0

아론 감사합니다. 나는 고맙다고 대답 할 – Thorsen

4

@Aaron이 말했듯이이 문제는 서브 쉘에서 실행되는 기능 때문에 발생합니다.

myfunc > >(echo) 

이 파이프는 것 거의 같은 일을하지만, 기본 쉘이 아닌 하위 프로세스에 myfunc에 실행 :하지만 그 대신 파이프의 공정 대체를 사용하여, bash는이를 방지 할 수있는 방법이있다. 이것은 bash-only 기능이며, 이 작동하려면 #!/bin/bash를 사용해야합니다.

+0

고마워. 그것은 매우 흥미로웠다. 이전에 프로세스 대체에 대해 들어 본 적이 없었습니다. 이것에 관해서 무식한 다른 누구를 위해, http://tldp.org/LDP/abs/html/process-sub.html은 도움이되는 자원처럼 보인다. – Thorsen