
다음 프로그램이 있고 $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}