2013-05-02 2 views
0

다음은 달성하려는 예제입니다.bash 함수의 전역 변수가 &와 함께 호출되면 전역 변수가 아닙니다.

#!/bin/bash 

func2() { 
    myarray=("e" "f") 
} 

func1() { 
    myarray=("c" "d") 
    for i in [1..10] 
    do 
     func2 & 
    done 
} 

myarray=("a" "b") 
func1 
echo "${myarray[@]}" 

끝에 에코

e f 

이어야하지만, I는 FUNC2를 호출 할 때

c d 

때문에 &의 되 버린다. 내가 밖으로 나가면 & 그것은 예상대로 실행됩니다. 이것은 한 번에 여러 서버에 ssh 호출을 만들기 위해 사용하는보다 복잡한 스크립트에 대한 개념 증명입니다. &의 멀티 스레딩 기능이 필요하지만 서브 쉘에서 실행되는 것처럼 보이기 때문에 모든 변수는 로컬입니까?!?!?

답변

1

당신이 꽤 부탁하지는 않지만 귀하의 질문은 서브 쉘에서 부모 쉘 변수에 영향을 미치는 방법이라고 가정합니다.

직접 수행 할 방법은 없지만 백그라운드 프로세스와 통신하여 관리 할 수 ​​있습니다. 가장 쉬운 방법은 완료 후 파일에 데이터를 쓰고 해석하는 것입니다. 하위 프로세스를 신뢰하는 경우 단순히 부모 프로세스에서 bash 코드 및 eval을 작성하게하십시오.

SIGCHLD에서 트랩을 사용하여 끝내면 감지 할 수 있습니다.

또 다른 방법은 GNU "parallel" 도구를 사용하고 완료 될 때 출력 파일을 수확하는 것일 수 있습니다.

"parallel-ssh"과 같은 도구를 사용하는 또 다른 방법이있을 수 있습니다.

자세한 내용을 제공하면 더 구체적인 답변을 얻을 수 있습니다.

+0

기본적으로 func2에서 실행되는 항목의 출력을 트랩하고 정렬 한 후 인쇄하고 싶습니다. 이제 문제는 func1 &을 실행하면 10 개의 프로세스에서 나온 모든 결과가 무작위로 반환된다는 것입니다. 즉, 호출 된 순서가 아닙니다. 문제가되지 않더라도 로컬 파일에 쓰기를 피하는 것이 좋습니다. – senorsmile

+0

좋습니다. 그러면 모든 명령이 완료 될 때까지 각 명령의 출력을 저장해야합니다. 파일 크기가 클 경우 파일에 저장하는 것이 메모리보다 더 좋습니다. 크기가 작 으면 각 프로세스 출력에 연결된 파이프에서 시간 초과 값을 읽는 bash "read"로 "select"또는 "poll"을 시뮬레이트 할 수는 있지만 효과적이지는 않습니다. – spbnick

+1

그러나 "GNU 병렬"은 설명서 페이지에서 판단 할 수 있습니다. "GNU 병렬을 사용하면 명령의 출력이 명령을 순차적으로 실행했을 때와 동일한 출력으로 나타납니다." – spbnick

관련 문제