셸 변수를 인쇄하면 빈 출력이 생성됩니다.

셸 변수를 인쇄하면 빈 출력이 생성됩니다.

다음 프로그램이 있고 $var프로그램의 실행 시간으로 채워진 변수를 인쇄하고 싶습니다. echo그러나 콘솔로 출력할 때에는 printf값이 비어있습니다.

프로그램:

#!/bin/bash
for n in 1 2 3 4;
    do my_time="$(time var=$(echo "scale=100; 4*a(1)" | bc -l))";
    
    echo $var
    echo $my_time       
    printf "Value of PI is :%s\n" $var
done

산출:

real    0m0.003s
user    0m0.000s
sys 0m0.000s


Value of PI is :

real    0m0.004s
user    0m0.000s
sys 0m0.000s


Value of PI is :

real    0m0.004s
user    0m0.000s
sys 0m0.000s


Value of PI is :

real    0m0.004s
user    0m0.000s
sys 0m0.000s


Value of PI is :

문제는 무엇이며 어떻게 해결합니까?

답변1

명령 대체는 $(...)서브셸에서 명령을 실행합니다. 하위 쉘에서 변수를 설정하면 상위 쉘로 전파되지 않습니다.

이 경우 time내장 함수가 표준 출력이나 오류로 출력하지 않기 때문에 문제가 더욱 커집니다. 출력을 캡처하려면 하위 쉘에서 실행하고 해당 쉘의 stderr을 캡처해야 합니다. 하지만 그런 다음 변수를 설정할 수 없습니다.

내가 볼 수 있는 유일한 방법은 명령을 두 번 실행하는 것입니다. 한 번은 출력을 캡처하고 한 번은 시간을 캡처하는 것입니다.

    var=$(bc -l <<< 'scale=100; 4*a(1)')
    my_time=$( (time bc -l <<< 'scale=100; 4*a(1)') 2>&1 >/dev/null)

또는 두 세부 정보를 동시에 캡처하고 나중에 분리합니다.

    out=$( (time bc -l <<< 'scale=100; 4*a(1)') 2>&1)
    var=${out%real*}
    my_time=real${out#*real}

관련 정보