다음은 달성하려는 예제입니다.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 호출을 만들기 위해 사용하는보다 복잡한 스크립트에 대한 개념 증명입니다. &의 멀티 스레딩 기능이 필요하지만 서브 쉘에서 실행되는 것처럼 보이기 때문에 모든 변수는 로컬입니까?!?!?
기본적으로 func2에서 실행되는 항목의 출력을 트랩하고 정렬 한 후 인쇄하고 싶습니다. 이제 문제는 func1 &을 실행하면 10 개의 프로세스에서 나온 모든 결과가 무작위로 반환된다는 것입니다. 즉, 호출 된 순서가 아닙니다. 문제가되지 않더라도 로컬 파일에 쓰기를 피하는 것이 좋습니다. – senorsmile
좋습니다. 그러면 모든 명령이 완료 될 때까지 각 명령의 출력을 저장해야합니다. 파일 크기가 클 경우 파일에 저장하는 것이 메모리보다 더 좋습니다. 크기가 작 으면 각 프로세스 출력에 연결된 파이프에서 시간 초과 값을 읽는 bash "read"로 "select"또는 "poll"을 시뮬레이트 할 수는 있지만 효과적이지는 않습니다. – spbnick
그러나 "GNU 병렬"은 설명서 페이지에서 판단 할 수 있습니다. "GNU 병렬을 사용하면 명령의 출력이 명령을 순차적으로 실행했을 때와 동일한 출력으로 나타납니다." – spbnick