2014-06-20 11 views
2

bash와 whiptail에 익숙하지 않으므로 무지를 변명하십시오.Whiptail Gauge : 변수가 루프가 설정되어 있지 않습니다.

for 루프에 var를 할당 할 때 Whiptail 대화 상자를 사용할 때 새로운 값인 20이 설정되지 않습니다. 어떤 제안?

andy="10" 
{ 
    for ((i = 0 ; i <= 100 ; i+=50)); do 
     andy="20" 
     echo $i 
     sleep 1 
    done 
} | whiptail --gauge "Please wait" 5 50 0 
# } 
echo "My val $andy 
+0

@shellter'()'은 (는) 서브 쉘입니다. '{}'은 그렇지 않습니다. 문제는 파이프입니다. – rici

답변

1

보통 {} 내부의 명령문은 서브 쉘에서 실행되지 않습니다. 그러나 파이프 (|)를 추가하면 서브 쉘에서 실행되는 것처럼 보입니다.

whiptail으로 파이프를 제거하면 andy의 업데이트 값이 표시됩니다.

+0

의견을 보내 주셔서 감사합니다. 나는 파이프 대신에 치환을 사용했다. – user3761314

2

파이프 라인 내의 명령 (즉, 일련의 명령은 |으로 구분됨)은 항상 하위 쉘에서 실행됩니다. 즉, 각 명령에는 자체 변수 환경이 있습니다. 복합 명령 (…) 내부의 명령은 동일하지만 서브 쉘을 만들지 않고 일반적으로 그룹화에 사용할 수있는 복합 명령 {…}은 해당되지 않습니다.

bash 또는 zsh에서 파이프 라인 대신 프로세스 대체를 사용하여이 문제를 해결할 수 있습니다. 예를 들어

andy="10" 
for ((i=0 ; i <= 100 ; i+=50)); do 
     andy="20" 
     echo $i 
     sleep 1 
done > >(whiptail --gauge "Please wait" 6 50 0) 
echo "My val $andy 

>(whiptail ...)whiptail를 실행하도록 만들어 질 서브 쉘을 야기한다; 전체 식은이 서브 쉘의 표준 입력의 이름으로 대체 될 것입니다 (리눅스에서는 /dev/fd/63과 같을 것입니다. 그러나 다른 OS에서는 FIFO 일 수 있습니다). > >(...)은 표준 출력을 서브 쉘의 표준 입력으로 재 지정합니다. 첫 번째 >은 정상적인 표준 리디렉션입니다.

+0

감사의 말 - 파이프 라인 대신 대용 암호가 트릭을 만들었습니다. – user3761314